菜单

scrapy抓取大学消息报告

2019年1月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.经过巡回爬取到独具的信息.

注册免费送38元体验金,个别对应的知识点为:

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