发布时间:2024-01-16 10:30
大家好,我是霖hero
除了钱,大家还比较喜欢什么?当然是全能、万能和通用的人或事物啦,例如:全能、什么都会的员工、万能钥匙、通用爬虫等等。今天我们学习Scrapy通用爬虫,利用Scrapy通用爬虫来获取美食杰网站。
Scrapy通用爬虫
创建Scrapy项目
Spider爬虫模板
CrawlSpider
创建crawl模板爬虫
定义rules规则
定义字段
提取数据
通用配置抽取
配置文件quotes.json
rules.py规则文件
启动爬虫run.py
spider爬虫初始化及获取配置
控制翻页数
实战演练
修改rules.py规则
修改quotes.json配置
修改next.py翻页
结果展示
Scrapy爬虫和Scrapy通用爬虫都是通过以下执行命令来创建Scrapy项目,没什么不同,命令如下所示:
Scrapy startproject Scrapy项目名
在创建spider爬虫前,我们先看看有什么可用的爬虫模板,执行命令如下所示:
scrapy genspider -l
运行结果如下图所示:
其中:
basic是我们之前创建Spider的时候,默认使用的爬虫模板,也就是普通的爬虫模板;
crawl模板是最常用于抓取常规网站的爬虫模板,通过指定一些爬取规则来实现页面的提取,很多情况下这个模板的爬取就足够通用;
csvfeed模板是Scrapy最简单的爬虫模板,主要用于解析 CSV 文件,它是以行为单位来进行迭代,每迭代一行调用一次 parse_row() 方法;
xmlfeed模板主要用于处理RSS订阅信息,RSS是一种信息聚合技术,可以让信息的发布和共享更为高效和便捷。
接下来我们主要是讲解最常用的爬虫模板——crawl模板,其他模板我们会在往后的文章里讲解,敬请期待!!!
在使用crawl模板前,我们先要了解一下CrawlSpider。
CrawlSpider是Scrapy提供的一个通用Spider,继承自Spider类,除了拥有Spider类的所有方法和属性,它还提供了rules属性和parse_start_url()方法。
其中:
rules是包含一个或多个Rule对象的列表,我们可以指定一些爬取规则来实现页面的提取;
parse_start_url()是一个可重写的方法,当start_urls里对应的Request得到的Response时,该方法被调用。
crawl模板的通用爬虫通过执行以下命令来创建,以Quotes to Scrape网站为例子,该网站是一个著名作家名言的网站,命令如下所示:
scrapy genspider -t 模板类型 <爬虫名字> <允许爬取的域名>
scrapy genspider -t crawl quotes quotes.toscrape.com
当然,我们可以把命令中的crawl改为xmlfeed或者csvfeed,这样就会生成其他类型的爬虫,成功创建后,在spiders文件夹中多了一个quotes.py文件,该文件正是我们创建的spider爬虫,其内容如下所示:
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class QuotesSpider(CrawlSpider):
name = \'quotes\'
allowed_domains = [\'quotes.toscrape.com\']
start_urls = [\'http://quotes.toscrape.com/\']
rules = (
Rule(LinkExtractor(allow=r\'Items/\'), callback=\'parse_item\', follow=True),
)
def parse_item(self, response):
item = {}
#item[\'domain_id\'] = response.xpath(\'//input[@id=\"sid\"]/@value\').get()
#item[\'name\'] = response.xpath(\'//div[@id=\"name\"]\').get()
#item[\'description\'] = response.xpath(\'//div[@id=\"description\"]\').get()
return item
其中:
class QuotesSpider()是自定义spider类,继承自CrawlSpider
name是定义此爬虫名称的字符串,每个项目唯一的名字,用来区分不同的Spider,启动爬虫时使用scrapy crawl +该爬虫名字;
allowed_domains是允许爬取的域名,防止爬虫爬到其他网站;
start_urls是最开始爬取的url;
rules是爬取规则属性,是一个包含多个Rule对象的列表,该Rule主要用来确定当前页面中的哪些链接需要继续爬取、哪些页面的爬取结果需要哪个方法来解析等。
parse_item()方法是负责解析返回响应、提取数据或进一步生成要处理的请求。
注意:不能修改这个方法的名字,且不能定义parse()方法!!!
在创建Crawl模板的Spider爬虫时,Rule中只展示了最常用的参数,其完整参数如下所示:
Rule(LinkExtractor(allow=r\'Items/\', deny=(), allowed_domains=(), deny_domains=(), restrict_xpaths=()), callback=\'parse_item\', follow=True, cb_kwargs=None, process_links=None, process_request=None)
Rule常见的参数如下:
LinkExtractor是一个链接提取对象,它定义了如何从每个已爬取的页面中提取链接并用于生成一个requests对象;
callback是一个可调用对象或字符,和之前定义requests的callback作用一样,
指定链接提取器提取的每个链接交给哪个解析函数去处理;
follow是一个布尔值,它指定是否从使用此规则提取的每个响应中跟踪链接,当callback为None时,follow默认为True,否则为False;
cb_kwargs是字典,其包含了传递给回调用函数的参数;
process_links指定处理函数,从LinkExtractor中获取到链接列表时,该函数将会被调用,主要用于过滤url;
process_request指定哪个函数将会被调用,该规则提取到每个request时都会调用该函数,主要用于过滤request。
LinkExtractor常用的参数如下:
allow:满足括号中正则表达式的URL会被提取,如果为空,则全部匹配;
deny:满足括号中正则表达式的URL不会被提取,优先级高于allow;
allow_domains:会被提取的链接的domains;
deny_domains:不会被提取的链接的domains;
restrict_xpaths:使用xpath表达式来规则URL地址的范围。
定义rules规则,也就是确定被提取的URL链接及其范围。
首先我们定义翻页的rules规则,进入名人名言网站并打开开发者工具,如下图所示:
由图可知,翻页的URL存放在
Rule(LinkExtractor(allow=r\'/page/\\d+\', restrict_xpaths=\'//li[@class=\"next\"]\'),follow=True),
由于我们在翻页的页面中,没有需要提取的数据,所以这里没有callback参数,所以需要加上follow=True。
由图可以知,
基于Netty,从零开发IM(二):编码实践篇(im单聊功能)
OceanBase 3.2.3 发版|HTAP引擎全面升级,TPC-H性能10倍提升~
gazebo 直接获取传感器数据_仿真器--gazebo+px4
语音识别的痛点在哪,从交互到精准识别如何做? | 硬创公开课
【C语言进阶篇】字符函数和字符串函数——strstr&&strtok&&strerror&&strncpy&&strncat&&strcmp函数
【FPGA教程案例15】基于vivado核的Cordic算法设计与实现
css浮动问题/css定位问题/css盒子模型/BFC原理详细剖析/css常用布局之flex布局grid布局table布局等—史上最全的css重难点整理笔记