收到上方任务安排,需要利用scrapy来围捕到手学院的情报报告.于是乎,新官上任三拿火,对刚学会爬数据的自我着急的及亲手起来.


任务

抓取四川大学公共管理学院官网(http://ggglxy.scu.edu.cn)所有的新闻咨询.

尝试流程

1.确定抓取目标.
2.制订抓取规则.
3.’编辑/调试’抓到手规则.
4.获取抓取数据

1.规定抓取目标

咱这次需要抓取的目标吧四川大学公共管理学院之兼具新闻资讯.于是咱们要掌握公管学院官网的布局结构.

微信截图_20170515223045.png

此地我们发现想如果抓及全方位的情报消息,不克直接当官网首页进行查扣到手,需要点击”more”进入到消息究竟栏目里面.

Paste_Image.png

咱看来了切实的情报栏目,但是及时明摆着不饱我们的抓取需求:
脚下新闻动态网页只能抓取新闻之时光,标题和URL,但是连无克抓取新闻之内容.据此我们怀念如果要进入及讯详情页抓取新闻的具体内容.

2.制订抓取规则

经第一部分的分析,我们会想到,如果我们要抓取一首新闻的切实可行信息,需要从新闻动态页面点击进入新闻详情页抓到手到消息的具体内容.我们点击一首新闻尝试一下

Paste_Image.png

咱俩发现,我们会直接在讯详情页面抓到手到我们得之数码:标题,时间,内容.URL.

哼,到现咱们领略抓取一篇新闻之笔触了.但是,怎抓取所有的情报内容吧?
即时明显难以不交我们.

我们在资讯栏目的无比下方能够看出页面跳转的按钮.那么我们得经”下一致页”按钮实现抓取所有的新闻.

那整理一下思路,我们会想到一个引人注目的抓取规则:
经办案取’新闻栏目下’所有的讯息链接,并且上到新闻详情链接里面抓到手有的消息内容.

3.’编/调试’抓到手规则

为吃调节爬虫的粒度尽量的有点,我以修和调试模块糅合在一起进行.
在爬虫中,我拿落实以下几个职能点:

1.攀登起同页消息栏目生之兼具新闻链接
2.通过爬至的同页新闻链接进入及讯详情爬取所待多少(主要是情报内容)
3.通过循环爬取到具备的新闻.

分别对应之知识点为:

1.爬起一个页面下之基础数据.
2.经爬至的多寡进行第二蹩脚爬取.
3.由此巡回对网页进行有数据的爬取.

话不多说,现在初始干.

3.1爬起一致页讯栏目下之兼具消息链接

Paste_Image.png

由此对情报栏目的源代码分析,我们发现所抓数据的组织为

Paste_Image.png

那我们只是需要以爬虫的选择器定位及(li:newsinfo_box_cf),再展开for循环抓取即可.

编辑代码
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

3.2经爬至的同等页新闻链接进入及新闻详情爬取所欲数(主要是情报内容)

今昔自家沾了一致组URL,现在本身欲进入到各国一个URL中捉到手自所要之题目,时间和情节,代码实现为格外简单,只需要在初代码抓到一个URL时上该URL并且抓取相应的数目即可.所以,我只有需要还写一个登新闻详情页的抓取方法,并且使用scapy.request调用即可.

编代码
#进入新闻详情页的抓取方法
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

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

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

URL都加上之未一致,难怪抓匪交了!
那么我们还得为即片漫长二级栏目的URL设定专门的条条框框,只需要投入判断是否为二级栏目:

  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地图