菜单

Python抓取大学音信报告注册免费送38元体验金

2019年2月18日 - 注册免费送38元体验金

任务

抓取湖南高校国有工学院官网(http://ggglxy.scu.edu.cn)所有的新闻咨询.

试验流程

1.分明抓取目的.
2.制定抓取规则.
3.’编辑/调试’抓取规则.
4.得到抓取数据

1.规定抓取目的

咱们本次必要抓取的对象为甘肃大学国有历史大学的装有情报资讯.于是大家须求理解公管大学官网的布局结构.

注册免费送38元体验金 1

此间大家发现想要抓到全体的资讯音信,无法平昔在官网首页举办抓取,要求点击”more”进入到新闻总栏目里面.

注册免费送38元体验金 2

咱俩见到了现实的消息栏目,但是那明显不满足我们的抓取须要: 当前新闻动态网页只好抓取音信的流年,标题和UTiggoL,然则并无法抓取音讯的内容.所以我们想要须要进入到消息详情页抓取音信的实际内容.

2.制定抓取规则

通过第③片段的辨析,大家会想到,假使大家要抓取一篇音讯的实际新闻,需求从音信动态页面点击进入音讯详情页抓取到消息的现实内容.大家点击一篇消息尝试一下

注册免费送38元体验金 3

们发现,我们可以直接在新闻详情页面抓取到大家必要的数据:标题,时间,内容.URAV4L.

好,到明天我们了解抓取一篇音讯的笔触了.不过,如何抓取全数的信息内容吗?
那分明难不到我们.

注册免费送38元体验金 4

我们在音讯栏目的最下方可以看出页面跳转的按钮.那么大家可以透过”下一页”按钮已毕抓取全体的信息.

那就是说整理一下思路,大家可以想到二个举世瞩目标抓取规则:
透过抓取’新闻栏目下’全体的消息链接,并且进入到消息详情链接里面抓取全部的消息内容.

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

为了让调节爬虫的粒度尽量的小,小编将编制和调试模块糅合在一道进行.
在爬虫中,作者将促成以下多少个作用点:

1.爬出一页音讯栏目下的具有新闻链接
2.透过爬到的一页音讯链接进入到消息详情爬取所需求多少(重如若情报内容)
3.通过轮回爬取到全数的消息.

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

1.爬出1个页面下的底子数据.
2.因而爬到的数量进行一次爬取.
3.透过轮回对网页举行具有数据的爬取.

话不多说,以后开干.

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

注册免费送38元体验金 5

由此对消息栏目标源代码分析,大家发现所抓数据的构造为

注册免费送38元体验金 6

那就是说大家只需求将爬虫的接纳器定位到(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

3.2透过爬到的一页新闻链接进入到新闻详情爬取所须要多少(重假如情报内容)

前天本人拿到了一组U锐界L,未来自小编必要进入到每二个U昂科威L中抓取小编所急需的标题,时间和故事情节,代码达成也挺不难,只须求在原来代码抓到多个UHighlanderL时进入该UOdysseyL并且抓取相应的数目即可.所以,小编只须求再写二个进来信息详情页的抓取方法,并且动用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

那会儿大家加贰个巡回:

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

U中华VL都长的不雷同,难怪抓不到了!
那么我们还得为那两条二级栏目标U奥迪Q5L设定专门的平整,只需求进入判断是不是为二级栏目:

  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

4.拿到抓取数据

     scrapy crawl news_info_2 -o 0016.json

读书进度中相见什么难点照旧想取得学习能源的话,欢迎参与学习交换群
626062078,大家一同学Python!

相关文章

发表评论

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

网站地图xml地图