CrawlSpider可以根据给定的规则自动爬取链接里的子页面的内容。
创建一个新的CrawlSpider项目,跟创建其他scrapy的Spider项目命令一样:
scrapy startproject scrapy_02
进入到spiders目录中:
cd .\scrapy_02\scrapy_02\spiders\
要爬取的页面是http://seller.cheshi.com/wuhan/:
想要获取每个经销商的链接,并通过链接进入到子页面,从子页面里获取经销商的名称,经销商的认证等级。
创建app逻辑代码文件:
scrapy genspider -t crawl app http://seller.cheshi.com/wuhan/
具体的app.py页面逻辑代码:
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class AppSpider(CrawlSpider):
name = "app"
allowed_domains = ["seller.cheshi.com"]
start_urls = ["http://seller.cheshi.com/wuhan/"]
rules = (
Rule(LinkExtractor(allow=r"seller.cheshi.com/\d+", deny=r"seller.cheshi.com/\d+/.+"), 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()
title = response.xpath('//*[@id="sel_block"]/div/h3/text()').get()
rank = response.xpath('//*[@id="sel_block"]/dl[1]/dd/i/@title').get()
print(title, response.url, rank)
return item
CrawlSpider只需要把起始链接和规则给它,然后在子页面使用xpath进行查找就可以找到结果了,不需要递归函数再执行一次进入子页面,获取相关数据,感觉有点不可思议啊,它在起始页使用规则,在正则表达式筛选的链接里进行查找xpath的内容。所有的xpath规则都是针对子页面的。
crawlspider继承与Spider类,除了继承的属性(name,allow_domains),
还提供了新的属性和方法:LinkExtractors 链接提取器
class scrapy.linkextractors.LinkExtractor
LinkExtractors的目的很简单:提取链接。
每个LinkExtractors有唯一的公共方法是extract_links(),他接收一个response对象,并返回一个scrapy.link.Link对象
Linkextractors要实力话一次,并且extract_links方法会根据不同的response调用多次提取链接主要参数:
1.allow:满足括号中“正则表达式”的值会被提取,如果为空,则会全部匹配。
2.deny:与这个正则表达式(或正则表达式列表)不匹配的URL一定不提取
3.allow_domains:会被提取的链接domains。
4.deny_domains:一定不会被提取链接的domains
5.restrick_xpaths:使用xpath表达式,和allow共同作用过滤链接rules
在rules中包含一个或多个Rule对象
每个Rule对爬取网站的动作定义了特定的操作。
如果多个rule匹配了相同的链接,则根据规则在本集合中被定义的顺序,第一个会被使用参数的介绍
link_extractors:是一个LinkExtractor对象,用于定义需要提取的链接
callback:从link_extractor中没获取链接时,参数所制定的值作为回调函数,该回调函数接受一个response作为起第一个参数
注意:当编写爬虫规则是,避免使用parse作为回调函数。由于CrawlSpider使用parse方法来实现其逻辑,如果覆盖了parse方法,CrawlSpider将会运行失败follow:是一个布尔值(boolean),制定了根据该规则从response提取的链接是偶需要跟进。如果callback为None,follow默认设置为True,否则默认为Flase
process_links:指定该Spider中那个的函数将会被调用,从link_extractor中获取到链接列表是将会调用该函数。该方法主要用来过滤
process_request:指定该Spider中那个的函数将会被调用,该规则提取到每个request是都会调用该函数。(用来过滤request)
生成的爬虫文件参数介绍
- LinkExtractor:顾名思义,链接提取器。
LinkExtractor(
allow=r'Items/',# 满足括号中“正则表达式”的值会被提取,如果为空,则全部匹配。
deny=xxx, # 满足正则表达式的则不会被提取。
restrict_xpaths=xxx, # 满足xpath表达式的值会被提取
restrict_css=xxx, # 满足css表达式的值会被提取
deny_domains=xxx, # 不会被提取的链接的domains。
)
- 作用:提取response中符合规则的链接。
- Rule : 规则解析器。根据链接提取器中提取到的链接,根据指定规则提取解析器链接网页中的内容。
Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True)
参数介绍:
参数1:指定链接提取器
参数2:指定规则解析器解析数据的规则(回调函数)
参数3:是否将链接提取器继续作用到链接提取器提取出的链接网页中。当callback为None,参数3的默认值为true。
rules=( ):指定不同规则解析器。一个Rule对象表示一种提取规则。
CrawlSpider整体爬取流程:
a).爬虫文件首先根据起始url,获取该url的网页内容
b).链接提取器会根据指定提取规则将步骤a中网页内容中的链接进行提取
c).规则解析器会根据指定解析规则将链接提取器中提取到的链接中的网页内容根据指定的规则进行解析
d).将解析数据封装到item中,然后提交给管道进行持久化存储
来源链接:https://www.jianshu.com/p/a6a08b4f7c04