scrapy抓取高校消息报告

收起上方任务安顿,须要使用scrapy来抓取大学的音信报告.于是乎,新官上任三把火,对刚学会爬数据的自笔者等不及的上手起来.

scrapy抓取大学新闻报告,scrapy抓取音讯

抓取山西大学集体军事大学官网(http://ggglxy.scu.edu.cn)所有的新闻咨询.


试行流程

1.规定抓取目的.
2.制订抓取规则.
3.’编纂/调节和测试’抓取规则.
4.获得抓取数据

任务

抓取青海南大学学共用教院官网(http://ggglxy.scu.edu.cn)全数的音讯咨询.

1.规定抓取指标

大家此次要求抓取的靶子为吉林院国有医高校的具备音讯资源信息.于是大家要求明白公管大学官网的布局结构.

亚洲城网页版 1
微信截图_20170515223045.png

此地大家发现想要抓到全体的情报音信,无法一向在官网首页举行抓取,必要点击”more”进入到音讯总栏目里面.

亚洲城网页版 2
Paste_Image.png

咱俩看来了实际的新闻栏目,不过那分明不满意大家的抓取必要: 当前音信动态网页只可以抓取音信的年华,标题和UEnclaveL,不过并不能够抓取音讯的内容.所以大家想要需求进入到信息详情页抓取信息的实际内容.

试验流程

1.鲜明抓取目的.
2.制订抓取规则.
3.’编辑/调节和测试’抓取规则.
4.取得抓取数据

2.制订抓取规则

由此第3有的的分析,大家会想到,假若我们要抓取一篇音讯的实际消息,必要从音信动态页面点击进入音讯详情页抓取到音讯的切实内容.大家点击一篇新闻尝试一下

亚洲城网页版 3
Paste_Image.png

大家发现,大家能够一向在情报详情页面抓取到大家须要的数额:标题,时间,内容.U奇骏L.

好,到后天我们掌握抓取一篇音信的思绪了.不过,怎么样抓取全体的音信内容吗?
这眼看难不到大家.

亚洲城网页版 4

我们在音信栏目标最下方可以看出页面跳转的按钮.那么大家得以通过”下一页”按钮完结抓取全数的音讯.

那么整理一下思路,我们能够想到三个家谕户晓的抓取规则:
经过抓取’新闻栏目下’全数的情报链接,并且进入到新闻详情链接里面抓取全数的资讯内容.

1.明确抓取指标

大家此次须要抓取的目的为青海高校集体师范高校的全部情报资源音信.于是我们要求知道公管高中校网的布局结构.

微信截图_20170515223045.png

那边我们发现想要抓到全体的情报音信,不可能一向在官网首页进行抓取,需求点击”more”进入到音讯总栏目里面.

Paste_Image.png

咱俩看到了切实的情报栏目,可是那眼看不满意大家的抓取需求:
当下消息动态网页只可以抓取音信的日子,标题和U宝马X3L,不过并无法抓取音信的内容.据此大家想要需求进入到音讯详情页抓取音信的切实内容.

3.’编辑/调节和测试’抓取规则

为了让调节爬虫的粒度尽量的小,小编将编写制定和调节模块糅合在一起实行.
在爬虫中,我将落到实处以下多少个职能点:

1.爬出一页新闻栏目下的所有新闻链接
2.通过爬到的一页新闻链接进入到新闻详情爬取所需要数据(主要是新闻内容)
3.通过循环爬取到所有的新闻.

独家对应的知识点为:

1.爬出一个页面下的基础数据.
2.通过爬到的数据进行二次爬取.
3.通过循环对网页进行所有数据的爬取.

话不多说,现在开干.

2.制订抓取规则

透过第叁片段的剖析,大家会想到,假诺大家要抓取一篇新闻的切实音讯,须要从音讯动态页面点击进入新闻详情页抓取到音信的切切实实内容.大家点击一篇音讯尝试一下

Paste_Image.png

咱俩发现,大家能够直接在音讯详情页面抓取到大家需求的多寡:标题,时间,内容.URL.

好,到现行大家驾驭抓取一篇音信的思绪了.可是,如何抓取全体的音讯内容呢?
那明明难不到咱们.

我们在情报栏目的最下方能够看出页面跳转的按钮.那么我们能够通过”下一页”按钮达成抓取全部的消息.

那正是说整理一下思路,大家能够想到三个明明的抓取规则:
因而抓取’音讯栏目下’全数的信息链接,并且进入到消息详情链接里面抓取全体的资源新闻内容.

3.1爬出一页新闻栏目下的持有情报链接

亚洲城网页版 5
Paste_Image.png

透过对新闻栏指标源代码分析,我们发现所抓数据的布局为

亚洲城网页版 6
Paste_Image.png

那就是说大家只必要将爬虫的选取器定位到(li:newsinfo_box_cf),再举行for循环抓取即可.

3.’编辑/调节和测试’抓取规则

为了让调节爬虫的粒度尽量的小,笔者将编辑和调节模块糅合在联合进行.
在爬虫中,我将贯彻以下多少个成效点:

1.爬出一页情报栏目下的具备音讯链接
2.通过爬到的一页消息链接进入到快讯详情爬取所急需多少(首假使新闻内容)
3.通过循环爬取到具有的消息.

独家对应的知识点为:

1.爬出二个页面下的根基数据.
2.由此爬到的数额进行2回爬取.
3.透过轮回对网页举行富有数据的爬取.

话不多说,今后开干.

编排代码
import scrapy

class News2Spider(scrapy.Spider):
    name = "news_info_2"
    start_urls = [
        "http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=1",
    ]

    def parse(self, response):
        for href in response.xpath("//div[@class='newsinfo_box cf']"):
            url = response.urljoin(href.xpath("div[@class='news_c fr']/h3/a/@href").extract_first())

亚洲城网页版,测试,通过!

亚洲城网页版 7
Paste_Image.png

3.1爬出一页情报栏目下的具备音讯链接

Paste_Image.png

通过对情报栏指标源代码分析,我们发现所抓数据的协会为

Paste_Image.png

那么大家只必要将爬虫的选取器定位到(li:newsinfo_box_cf),再拓展for循环抓取即可.

3.2经过爬到的一页音信链接进入到新闻详情爬取所供给多少(重借使情报内容)

当今本身获得了一组U安德拉L,现在本身索要进入到每1个U酷威L中抓取笔者所供给的标题,时间和内容,代码达成也挺简单,只必要在原始代码抓到3个UCRUISERL时进入该U奥德赛L并且抓取相应的数目即可.所以,作者只供给再写一个进来消息详情页的抓取方法,并且使用scapy.request调用即可.

编辑代码
import scrapy

class News2Spider(scrapy.Spider):
    name = "news_info_2"
    start_urls = [
        "http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=1",
    ]

    def parse(self, response):
        for href in response.xpath("//div[@class='newsinfo_box cf']"):
            url = response.urljoin(href.xpath("div[@class='news_c fr']/h3/a/@href").extract_first())

测试,通过!

Paste_Image.png

编写代码
#进入新闻详情页的抓取方法
def parse_dir_contents(self, response):
        item = GgglxyItem()
        item['date'] = response.xpath("//div[@class='detail_zy_title']/p/text()").extract_first()
        item['href'] = response
        item['title'] = response.xpath("//div[@class='detail_zy_title']/h1/text()").extract_first()
        data = response.xpath("//div[@class='detail_zy_c pb30 mb30']")
        item['content'] = data[0].xpath('string(.)').extract()[0]
        yield item

组合进原有代码后,有:

import scrapy
from ggglxy.items import GgglxyItem

class News2Spider(scrapy.Spider):
    name = "news_info_2"
    start_urls = [
        "http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=1",
    ]

    def parse(self, response):
        for href in response.xpath("//div[@class='newsinfo_box cf']"):
            url = response.urljoin(href.xpath("div[@class='news_c fr']/h3/a/@href").extract_first())
            #调用新闻抓取方法
            yield scrapy.Request(url, callback=self.parse_dir_contents)


    #进入新闻详情页的抓取方法                
    def parse_dir_contents(self, response):
            item = GgglxyItem()
            item['date'] = response.xpath("//div[@class='detail_zy_title']/p/text()").extract_first()
            item['href'] = response
            item['title'] = response.xpath("//div[@class='detail_zy_title']/h1/text()").extract_first()
            data = response.xpath("//div[@class='detail_zy_c pb30 mb30']")
            item['content'] = data[0].xpath('string(.)').extract()[0]
            yield item

测试,通过!

亚洲城网页版 8
Paste_Image.png

此时大家加3个循环:

NEXT_PAGE_NUM = 1 

NEXT_PAGE_NUM = NEXT_PAGE_NUM + 1
        if NEXT_PAGE_NUM<11:
            next_url = 'http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=%s' % NEXT_PAGE_NUM
            yield scrapy.Request(next_url, callback=self.parse)

进入到原来代码:

import scrapy
from ggglxy.items import GgglxyItem

NEXT_PAGE_NUM = 1


class News2Spider(scrapy.Spider):
    name = "news_info_2"
    start_urls = [
        "http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=1",
    ]

    def parse(self, response):
        for href in response.xpath("//div[@class='newsinfo_box cf']"):
            URL = response.urljoin(href.xpath("div[@class='news_c fr']/h3/a/@href").extract_first())
            yield scrapy.Request(URL, callback=self.parse_dir_contents)
        global NEXT_PAGE_NUM
        NEXT_PAGE_NUM = NEXT_PAGE_NUM + 1
        if NEXT_PAGE_NUM<11:
            next_url = 'http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=%s' % NEXT_PAGE_NUM
            yield scrapy.Request(next_url, callback=self.parse) 



    def parse_dir_contents(self, response):
            item = GgglxyItem() 
            item['date'] = response.xpath("//div[@class='detail_zy_title']/p/text()").extract_first()
            item['href'] = response 
            item['title'] = response.xpath("//div[@class='detail_zy_title']/h1/text()").extract_first()
            data = response.xpath("//div[@class='detail_zy_c pb30 mb30']")
            item['content'] = data[0].xpath('string(.)').extract()[0] 
            yield item

测试:

亚洲城网页版 9
Paste_Image.png

抓到的数目为191,可是大家看官网发现有193条情报,少了两条.
怎么呢?大家注意到log的error有两条:
定位难点:原来发现,大学的新闻栏目还有两条隐匿的二级栏目:
比如:

亚洲城网页版 10
Paste_Image.png

对应的URL为

亚洲城网页版 11
Paste_Image.png

UTiggoL都长的差异,难怪抓不到了!
这便是说大家还得为那两条二级栏目标U牧马人L设定越发的条条框框,只须要参预判断是或不是为二级栏目:

  if URL.find('type') != -1:
      yield scrapy.Request(URL, callback=self.parse)

组建原函数:

import scrapy
from ggglxy.items import GgglxyItem

NEXT_PAGE_NUM = 1


class News2Spider(scrapy.Spider):
    name = "news_info_2"
    start_urls = [
        "http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=1",
    ]

    def parse(self, response):
        for href in response.xpath("//div[@class='newsinfo_box cf']"):
            URL = response.urljoin(href.xpath("div[@class='news_c fr']/h3/a/@href").extract_first())
            if URL.find('type') != -1:
                yield scrapy.Request(URL, callback=self.parse)
            yield scrapy.Request(URL, callback=self.parse_dir_contents)
        global NEXT_PAGE_NUM
        NEXT_PAGE_NUM = NEXT_PAGE_NUM + 1
        if NEXT_PAGE_NUM<11:
            next_url = 'http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=%s' % NEXT_PAGE_NUM
            yield scrapy.Request(next_url, callback=self.parse) 



    def parse_dir_contents(self, response):
            item = GgglxyItem() 
            item['date'] = response.xpath("//div[@class='detail_zy_title']/p/text()").extract_first()
            item['href'] = response 
            item['title'] = response.xpath("//div[@class='detail_zy_title']/h1/text()").extract_first()
            data = response.xpath("//div[@class='detail_zy_c pb30 mb30']")
            item['content'] = data[0].xpath('string(.)').extract()[0] 
            yield item

测试:

亚洲城网页版 12
Paste_Image.png

大家发现,抓取的数据由在此之前的193条扩充到了238条,log里面也没有error了,表达大家的抓取规则OK!

3.2透过爬到的一页信息链接进入到音信详情爬取所须求多少(首假如情报内容)

现行反革命自家获得了一组U福特ExplorerL,今后本人急需进入到每二个U大切诺基L中抓取作者所急需的标题,时间和剧情,代码完成也挺简单,只要求在原有代码抓到二个U奔驰G级L时进入该UCRUISERL并且抓取相应的多寡即可.所以,小编只须要再写二个跻身信息详情页的抓取方法,并且使用scapy.request调用即可.

4.获取抓取数据

     scrapy crawl news_info_2 -o 0016.json

上学进程中遭受哪些难点照旧想赢得学习能源的话,欢迎参与学习调换群
626062078,我们一道学Python!

http://www.bkjia.com/Pythonjc/1215885.htmlwww.bkjia.comtruehttp://www.bkjia.com/Pythonjc/1215885.htmlTechArticlescrapy抓取学院新闻报告,scrapy抓取新闻
抓取云南大学集体经院官网(http://ggglxy.scu.edu.cn)所有的新闻咨询.
实验流程 1.明确抓取目的. 2.制…

编辑代码
#进入新闻详情页的抓取方法
def parse_dir_contents(self, response):
        item = GgglxyItem()
        item['date'] = response.xpath("//div[@class='detail_zy_title']/p/text()").extract_first()
        item['href'] = response
        item['title'] = response.xpath("//div[@class='detail_zy_title']/h1/text()").extract_first()
        data = response.xpath("//div[@class='detail_zy_c pb30 mb30']")
        item['content'] = data[0].xpath('string(.)').extract()[0]
        yield item

组成进原有代码后,有:

import scrapy
from ggglxy.items import GgglxyItem

class News2Spider(scrapy.Spider):
    name = "news_info_2"
    start_urls = [
        "http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=1",
    ]

    def parse(self, response):
        for href in response.xpath("//div[@class='newsinfo_box cf']"):
            url = response.urljoin(href.xpath("div[@class='news_c fr']/h3/a/@href").extract_first())
            #调用新闻抓取方法
            yield scrapy.Request(url, callback=self.parse_dir_contents)


    #进入新闻详情页的抓取方法                
    def parse_dir_contents(self, response):
            item = GgglxyItem()
            item['date'] = response.xpath("//div[@class='detail_zy_title']/p/text()").extract_first()
            item['href'] = response
            item['title'] = response.xpath("//div[@class='detail_zy_title']/h1/text()").extract_first()
            data = response.xpath("//div[@class='detail_zy_c pb30 mb30']")
            item['content'] = data[0].xpath('string(.)').extract()[0]
            yield item

测试,通过!

Paste_Image.png

这时候我们加1个循环往复:

NEXT_PAGE_NUM = 1 

NEXT_PAGE_NUM = NEXT_PAGE_NUM + 1
        if NEXT_PAGE_NUM<11:
            next_url = 'http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=%s' % NEXT_PAGE_NUM
            yield scrapy.Request(next_url, callback=self.parse) 

参与到原来代码:

import scrapy
from ggglxy.items import GgglxyItem

NEXT_PAGE_NUM = 1


class News2Spider(scrapy.Spider):
    name = "news_info_2"
    start_urls = [
        "http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=1",
    ]

    def parse(self, response):
        for href in response.xpath("//div[@class='newsinfo_box cf']"):
            URL = response.urljoin(href.xpath("div[@class='news_c fr']/h3/a/@href").extract_first())
            yield scrapy.Request(URL, callback=self.parse_dir_contents)
        global NEXT_PAGE_NUM
        NEXT_PAGE_NUM = NEXT_PAGE_NUM + 1
        if NEXT_PAGE_NUM<11:
            next_url = 'http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=%s' % NEXT_PAGE_NUM
            yield scrapy.Request(next_url, callback=self.parse) 



    def parse_dir_contents(self, response):
            item = GgglxyItem() 
            item['date'] = response.xpath("//div[@class='detail_zy_title']/p/text()").extract_first()
            item['href'] = response 
            item['title'] = response.xpath("//div[@class='detail_zy_title']/h1/text()").extract_first()
            data = response.xpath("//div[@class='detail_zy_c pb30 mb30']")
            item['content'] = data[0].xpath('string(.)').extract()[0] 
            yield item

测试:

Paste_Image.png

抓到的数目为191,不过我们看官网发现有193条情报,少了两条.
何以呢?大家注意到log的error有两条:
定位难题:原来发现,高校的音讯栏目还有两条隐形的二级栏目:
比如:

Paste_Image.png

对应的URL为

Paste_Image.png

U哈弗L都长的不一样,难怪抓不到了!
那么大家还得为这两条二级栏目标U揽胜极光L设定尤其的平整,只要求投入判断是或不是为二级栏目:

  if URL.find('type') != -1:
      yield scrapy.Request(URL, callback=self.parse)

组建原函数:

import scrapy
from ggglxy.items import GgglxyItem

NEXT_PAGE_NUM = 1


class News2Spider(scrapy.Spider):
    name = "news_info_2"
    start_urls = [
        "http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=1",
    ]

    def parse(self, response):
        for href in response.xpath("//div[@class='newsinfo_box cf']"):
            URL = response.urljoin(href.xpath("div[@class='news_c fr']/h3/a/@href").extract_first())
            if URL.find('type') != -1:
                yield scrapy.Request(URL, callback=self.parse)
            yield scrapy.Request(URL, callback=self.parse_dir_contents)
        global NEXT_PAGE_NUM
        NEXT_PAGE_NUM = NEXT_PAGE_NUM + 1
        if NEXT_PAGE_NUM<11:
            next_url = 'http://ggglxy.scu.edu.cn/index.php?c=special&sid=1&page=%s' % NEXT_PAGE_NUM
            yield scrapy.Request(next_url, callback=self.parse) 



    def parse_dir_contents(self, response):
            item = GgglxyItem() 
            item['date'] = response.xpath("//div[@class='detail_zy_title']/p/text()").extract_first()
            item['href'] = response 
            item['title'] = response.xpath("//div[@class='detail_zy_title']/h1/text()").extract_first()
            data = response.xpath("//div[@class='detail_zy_c pb30 mb30']")
            item['content'] = data[0].xpath('string(.)').extract()[0] 
            yield item

测试:

Paste_Image.png

咱俩发现,抓取的数目由在此在此之前的193条增添到了238条,log里面也并未error了,表明大家的抓取规则OK!

4.赢得抓取数据

     scrapy crawl news_info_2 -o 0016.json

有关推荐
scrapy通过scrapyinghub完毕24钟头爬虫托管爬取
scrapy抓取加尔各答房价音信

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图