接受上方职务安顿,供给选择scrapy来抓取高校的资源消息报告.于是乎,新官上任三把火,对刚学会爬数据的自个儿急忙的上手起来.


任务

抓取江苏大学公共哲高上校网(http://ggglxy.scu.edu.cn)全数的消息咨询.

实验流程

1.鲜明抓取指标.
2.制定抓取规则.
3.’编写制定/调节和测试’抓取规则.
4.获得抓取数据

1.明确抓取指标

我们本次须求抓取的对象为山西大学国有工高校的持有音讯资讯.于是我们须求通晓公管大学官网的布局结构.

微信截图_20170515223045.png

那边大家发现想要抓到全体的情报消息,不能够直接在官网首页举办抓取,需求点击”more”进入到音讯总栏目里面.

Paste_Image.png

我们看到了具体的资源音信栏目,然则那肯定不满足我们的抓取要求:
当前音信动态网页只好抓取新闻的岁月,标题和U昂科拉L,可是并不可能抓取音信的内容.由此大家想要必要进入到新闻详情页抓取音讯的切实内容.

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由此爬到的一页音信链接进入到情报详情爬取所要求多少(首假诺情报内容)

明天自笔者获取了一组U宝马X3L,以往自家索要进入到每多个U智跑L中抓取小编所急需的标题,时间和内容,代码完成也挺不难,只需求在本来代码抓到多少个U奥迪Q5L时进入该UENCOREL并且抓取相应的数码即可.所以,笔者只须要再写一个跻身音信详情页的抓取方法,并且利用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

那时咱们加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

测试:

Paste_Image.png

抓到的多寡为191,可是咱们看官网发现有193条音讯,少了两条.
何以呢?大家注意到log的error有两条:
定位难题:原来发现,大学的音讯栏目还有两条躲藏的二级栏目:
比如:

Paste_Image.png

对应的URL为

Paste_Image.png

UCR-VL都长的不同,难怪抓不到了!
那就是说大家还得为那两条二级栏指标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地图