scrapy之多url页面数据的抓取

时光怂恿深爱的人放手 提交于 2020-03-24 11:39:26

【概述】

如果我们想要对某一个网站的全站数据进行抓取,我们通常会有如下两种解决方法:

1.手动请求的发送(即基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法))代码详见:scrapy之多url页面数据的抓取

2.基于CrawlSpider的自动爬取进行实现(更加简洁和高效,推荐使用)

【CrawlSpider】

1.简介

CrawlSpider其实是Spider的一个子类,除了继承到Spider的特性和功能外,还派生除了其自己独有的更加强大的特性和功能。Spider是所有爬虫的基类,其设计原则只是为了爬取start_url列表中网页,而从爬取到的网页中提取出的url进行继续的爬取工作使用CrawlSpider更合适。

2.两大功能组件:

a.链接提取器(LinkExtractor):提取response中符合规则的链接。

LinkExtractor(allow=r'Items/',deny=xxx,restrict_xpath=xxx,restrict_css=xxx,deny_domains=xxx)

    参数说明:

    allow=r'Items/'  # 满足括号中“正则表达式”的值会被提取,如果为空,则全部匹配。

 deny=xxx  # 满足正则表达式的则不会被提取。

    restrict_xpaths=xxx  # 满足xpath表达式的值会被提取

 restrict_css=xxx # 满足css表达式的值会被提取

 deny_domains=xxx # 不会被提取的链接的domains

b.规则解析器(Rule):根据链接提取器提取到的链接,解析相关网页中的内容

Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True)

 参数说明:

LinkExtractor(allow=r'Items/'):指定链接提取器

callback:指定规则解析器解析数据的规则(回调函数)

follow:是否将链接提取器继续作用到链接提取器提取出的链接网页中。当callback为None,参数3的默认值为true。

3.CrawlSpider整体爬取流程:

a.爬虫文件首先根据起始url,获取该url的网页内容

b.链接提取器会根据指定提取规则将步骤a中网页内容中的链接进行提取

c.规则解析器会根据指定解析规则将链接提取器中提取到的链接中的网页内容根据指定的规则进行解析

d.将解析数据封装到item中,然后提交给管道进行持久化存储

3.使用方式:

a.创建scrapy工程:scrapy startproject projectName

b.创建爬虫文件:scrapy genspider -t crawl spiderName 对应url

(ps:此指令对比以前的指令多了 "-t crawl",表示创建的爬虫文件是基于CrawlSpider这个类的,而不再是Spider这个基类)

 1 class QiushiTextSpider(CrawlSpider):
 2     name = 'qiushi_text'
 3     allowed_domains = ['https://www.qiushibaike.com/text/']
 4     start_urls = ['https://www.qiushibaike.com/text/']
 5 
 6     rules = (
 7         Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
 8     )
 9 
10     def parse_item(self, response):
11         item = {}
12         #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
13         #item['name'] = response.xpath('//div[@id="name"]').get()
14         #item['description'] = response.xpath('//div[@id="description"]').get()
15         return item
爬虫文件初始内容

c.执行:scrapy crawl spiderName

代码示例:

 1 # -*- coding: utf-8 -*-
 2 import scrapy
 3 #导入items,用于持久化存储
 4 from crawlspider_demo.items import CrawlspiderDemoItem
 5 from scrapy.linkextractors import LinkExtractor
 6 from scrapy.spiders import CrawlSpider, Rule
 7 
 8 
 9 class QiushiTextSpider(CrawlSpider):
10     name = 'qiushi_text'
11     #allowed_domains = ['https://www.qiushibaike.com/text/']
12     start_urls = ['https://www.qiushibaike.com/text/']
13 
14     '''实例化了一个链接提取器对象:用来提取特定的url
15        allow参数:赋值一个正则表达式
16        链接提取器可以根据此表达式在页面中提取指定的链接,并将提取到的链接全部交给规则解析器'''
17     link = LinkExtractor(allow=r'/text/page/\d+/')
18 
19     '''指定不同规则解析器。一个Rule对象表示一种提取规则。
20        实例化了一个规则解释器对象
21        规则解析器接受了链接提取器发送的链接后,就会对这些链接发起请求,获取页面内的请求数据
22        callback:指定一个解析规则(方法/函数)
23        follow:是否将链接提取器继续作用到链接提取器取出的链接所表示的页面数据中'''
24     rules = (
25         Rule(link, callback='parse_item', follow=True),
26     )
27 
28     def parse_item(self, response):
29         content_list = response.xpath('//div[@id="content-left"]/div')
30         for content in content_list:
31             author = content.xpath('normalize-space(./div/a[2]/h2/text())').extract_first()
32             content_detail = content.xpath('normalize-space(.//div[@class="content"]/span/text())').extract()[0]
33             # 将解析到的数据值存储到items对象
34             item = CrawlspiderDemoItem()
35             item['author'] = author
36             item['content_detail'] = content_detail
37 
38             # 将item对象提交给管道
39             yield item

注:由于此次代码所实现的效果与scrapy之多url页面数据的抓取的代码一致,只是不同的实现方式而已,因此其它代码,请跳转至scrapy之多url页面数据的抓取

 

声明:本内容仅用于学习参阅,勿用他用。本节部分内容参阅:http://xiaobaibook.com/details/60/,大家可自行前往学习。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!