菜单

注册免费送38元体验金scrapy抓到手学院新闻报告

2018年9月14日 - 注册免费送38元体验金

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

试行流程

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

1.规定抓取目标

俺们这次需要抓取的对象为四川大学公共管理学院之拥有新闻资讯.于是咱要理解公管学院官网的布局结构.

注册免费送38元体验金 1

微信截图_20170515223045.png

此处我们发现想要围捕及全部底讯息消息,不能够直接在官网首页进行逮捕到手,需要点击”more”进入到消息究竟栏目里面.

注册免费送38元体验金 2

Paste_Image.png

俺们看看了切实可行的资讯栏目,但是及时明显不满足我们的抓取需求: 当前新闻动态网页只能抓取新闻的时日,标题和URL,但是连无能够抓取新闻之内容.所以我们想如果要进入到新闻详情页抓取新闻之具体内容.

2.制定抓取规则

透过第一部分的分析,我们会想到,如果我们设抓取一首新闻的切切实实信息,需要打新闻动态页面点击上新闻详情页抓到手到消息的具体内容.我们点击一篇新闻尝试一下

注册免费送38元体验金 3

Paste_Image.png

我们发现,我们能够一直在新闻详情页面抓到手到我们要之数:标题,时间,内容.URL.

吓,到本咱们知晓抓取一首新闻的笔触了.但是,如何抓取所有的新闻内容吧?
旋即肯定难休交我们.

注册免费送38元体验金 4

咱俩于新闻栏目的顶下方能够看到页面跳转的按钮.那么我们得经”下同样页”按钮实现抓取所有的新闻.

这就是说整理一下思路,我们能够想到一个阳的抓取规则:
经围捕取’新闻栏目下’所有的讯息链接,并且上及新闻详情链接里面抓到手有的资讯内容.

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

为为调节爬虫的粒度尽量的小,我拿修和调剂模块糅合在一起进行.
在爬虫中,我以实现以下几只功能点:

1.爬起同样页新闻栏目下之有情报链接
2.通过爬至的同样页新闻链接进入到新闻详情爬取所急需多少(主要是新闻内容)
3.由此巡回爬取到持有的新闻.

分别对应的知识点为:

1.攀登来一个页面下的根基数据.
2.透过爬至之多少开展第二糟糕爬取.
3.由此巡回对网页进行具有数据的爬取.

话不多说,现在开班干.

3.1攀登起同样页新闻栏目下的拥有情报链接

注册免费送38元体验金 5

Paste_Image.png

通过对新闻栏目的源代码分析,我们发现所抓数据的组织也

注册免费送38元体验金 6

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())

测试,通过!

注册免费送38元体验金 7

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

测试,通过!

注册免费送38元体验金 8

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

测试:

注册免费送38元体验金 9

Paste_Image.png

办案及之数为191,但是我们看官网发现产生193长长的新闻,少了简单条.
为底吧?我们注意到log的error有个别漫长:
定位问题:原来发现,学院的新闻栏目还有少数条隐蔽的二级栏目:
比如:

注册免费送38元体验金 10

Paste_Image.png

对应的URL为

注册免费送38元体验金 11

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

测试:

注册免费送38元体验金 12

Paste_Image.png

咱们发现,抓取的数额由以前的193长达长至了238长长的,log里面为不曾error了,说明我们的抓取规则OK!

4.到手抓取数据

     scrapy crawl news_info_2 -o 0016.json

修过程遭到相见什么问题要么想博得学习资源的言辞,欢迎加入学习交流群
626062078,我们一同学Python!

相关文章

标签:

发表评论

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

网站地图xml地图