Scrapy使用CrawlSpider自动获取详情页和翻页操作

鳄鱼君

发表文章数:642

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » Scrapy使用CrawlSpider自动获取详情页和翻页操作

我们在使用Scrapy框架爬虫的时候,大部分的代码都是在寻找下一页的url地址或者是详情页的url地址,然后交给不同的解析函数解析,那么Scrapy作为如此强大的爬虫框架,很显然我们不需要那么费劲。思路:

  • 1.从resposne中使用xpath提取a标签中的url地址
  • 2.自动构造自己的request请求,发送给引擎。
  • 3.只有满足条件的url地址,我们才发送给引擎,同时能够制定callback函数。

生成CrawlSpider爬虫需要使用命令:

scrapy genspider -t crawl 爬虫名字 url地址

之后生成的爬虫大致样式如下(简单做了一下修改):

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class HenanSpider(CrawlSpider):
    name = 'henan'
    allowed_domains = ['hnzwfw.gov.cn']
    start_urls = ['http://hnzwfw.gov.cn/']
    # 实例化了一个链接提取对象
    # 作用:根据指定规则(allow)进行连接(url)的提取
    # 提取页码链接
    link=LinkExtractor(allow=r'Items/')
    rules = (
        # 实例化一个Rule对象,调用的是该对象的构造方法
        # 作用: 可以接收链接提取器提取到的链接,且对其进行请求发送,然后根据指定形式(callback)进行数据解析
        Rule(link, callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        print(reqponse)

在使用CrawlSpider的时候需要特别注意:

  • 1.用命令创建CrawlSpider的方式:scrapy genspider -t crawl 爬虫名字 url地址,也可以手动创建。
  • 2.CrawlSpider中不能再有parse为名字的解析函数,这个方法被CrawlSpider用来实现基础url提取等功能。
  • 3.一个Rule对象接收很多参数,首先第一个是包含url规则的LinkExtractor对象,常用的还有callback(制定满足规则的url解析函数)和follow(response中提取的链接是否需要跟进处理。)
  • 4.不指定callback函数的请求时,如果follow为True,满足改Rule规则的url还会继续请求。
  • 5.如果多个Rule都满足某一个url,会从Rule中选择第一个满足的进行操作,这就要求我们需要准确的提取url,避免出现这种情况。

然后我们来看一些各部分具体参数的解释:

spider.Rule常见参数:

  • link_extractor: 是一个Link Extractor对象,用于定义需要提取的url链接。
  • callback:从link_extractor中每获取到链接时,参数的值作为回调函数。
  • follow:是一个boolean布尔值,指定了根据该规则从response提取的链接是否需要跟进,如果callback为None,follow默认为True,否则默认就是False。
  • process_links:指定该spider中哪个函数将会被调用,从link_extractor中获取到链接列表时将会代用该函数,该方法主要用来过滤url。
  • process_request:指定该spider中哪个的函数将会被调用,该规则提取到每个request时都会调用该函数,用来过滤request。

LinkExtractor更多常见参数

  • allow:满足括号中”正则表达式”的url会被提取,如果为空,则全部提取。
  • deny:满足括号中”正则表达式”的url一定不提取,优先级高于allow。
  • allow_domains:会被提取的链接的domains。
  • deny_domains:一定不会提取链接的domains。
  • restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接,及满足xpath满足范围内的url地址会被提取。

那么就以:http://circ.gov.cn/web/site0/tab5240/网站作为演示,这样能更清楚的知道该如何使用。我们还是先创建爬虫项目,然后使用scrapy genspider -t crawl gov circ.gov.cn命令创建爬虫,代码参考:

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

import re
class GovSpider(CrawlSpider):
    name = 'gov'
    allowed_domains = ['circ.gov.cn']
    start_urls = ['http://circ.gov.cn/web/site0/tab5240/']
    #定义提取url规则
    rules = (
        #LinkExtractor 连接提取器,提取url地址
        #callback  提取出来的url地址的response会交给callback处理
        #follow  当前url地址的响应是否重新跟进Rules来提取url地址

        #寻找详情页的url地址,回调函数解析详情页数据,提取标题和日期
        Rule(LinkExtractor(allow=r'/web/site0/tab5240/info\d+\.htm'), callback='parse_item'),
        #寻找翻页的url地址,我们不需要拼接url,需要继续跟进
        Rule(LinkExtractor(allow=r'/web/site0/tab5240/module14430/page\d+\.htm'),follow=True),
    )
    #parse函数有特殊功能,不能重新定义
    def parse_item(self, response):
        item={}
        item['title']=re.findall('<!--TitleStart-->(.*?)<!--TitleEnd-->',response.body.decode(),re.S)[0]
        item['publish_data']=re.findall('发布时间:(20\d{2}-\d{2}-\d{2})',response.body.decode(),re.S)[0]
        print(item)

这样我们就简单的实现了详情页数据的抓取和翻页操作。需要注意的是Rule规则里面LinkExtractor的参数allow使用正则来匹配的,一般详情页提取出来需要指定callback函数翻页需要让follow=True继续跟进

当然我们也可以使用CrawlSpider进行翻页操作,通过parse_item函数提取列表页面的标题和详情页的url地址,然后parse_detail函数提取详情页的日期,代码参考:

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

import re
class GovSpider(CrawlSpider):
    name = 'gov'
    allowed_domains = ['circ.gov.cn']
    start_urls = ['http://circ.gov.cn/web/site0/tab5240/']
    #定义提取url规则
    rules = (
        #寻找翻页的url地址,我们不需要拼接url,需要继续跟进
        Rule(LinkExtractor(allow=r'/web/site0/tab5240/module14430/page\d+\.htm'),callback='parse_item',follow=True),
    )
    def parse_item(self,response):
        lis=response.xpath('//span[@id="lan1"]')
        for i in lis:
            item={}
            item['title']=i.xpath('./a/text()').extract_first()
            item['href']='http://circ.gov.cn'+i.xpath('./a/@href').extract_first()
            yield scrapy.Request(
                item['href'],callback=self.parse_detail,meta={"item":item}
            )
    def parse_detail(self,response):
        item=response.meta['item']
        item['data']=re.findall('发布时间:(20\d{2}-\d{2}-\d{2})',response.body.decode(),re.S)[0]
        print(item)

以上只是演示,我们可以在实践中灵活运用!

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Scrapy使用CrawlSpider自动获取详情页和翻页操作》 发布于2020-03-09

分享到:
赞(3) 赏杯咖啡

评论 抢沙发

2 + 8 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册