crawlspider
介绍
Scrapy框架中分两类爬虫
Spider类和CrawlSpider类。
crawlspider是Spider的派生类(一个子类),Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则(rule)来提供跟进link的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合。
创建模板
创建 crawlspider 项目
scrapy genspider -t crawl 爬虫名 爬虫运行抓取的域名范围
栗子:
scrapy genspider -t crawl job_163 hr.163.com
具体参数和解释
import scrapy
from scrapy.linkextractors import LinkExtractor # 连接提取器
from scrapy.spiders import CrawlSpider, Rule # 导入CrawlSpider类,Rule规则
# CrawlSpider
class Job163Spider(CrawlSpider):
name = 'job_163'
allowed_domains = ['hr.163.com']
start_urls = ['http://hr.163.com/']
# 规则的元祖 规则可以有多个 存放 规则 对象
rules = (
# 创建了一个规则对象
# LinkExtractor: 连接提取对象,allow 跟的是一个正则,根据这个正则表达式从响应中自动的去提取符合规则的url地址
# callback: 指定 前面根据连接提取器规则 提取出来的url地址的响应交给哪一个解析函数去处理,接收的是一个方法名的字符串
# callback 如果传了 表示需要去解析这个响应
# callback 如果没传 表示不需要去解析这个响应
# follow: 表示是否跟进,表示根据连接提取器提取出来的url地址的响应,是否还需要按照连接提取器的规则继续去提取url地址
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
重点在rules中:
-
rules
是一个元组或者是列表,包含的是Rule对象 -
Rule
表示规则,其中包含LinkExtractor,callback和follow
等参数-
LinkExtractor
:连接提取器,可以通过正则或者是xpath来进行url地址的匹配 -
callback
:表示经过连接提取器提取出来的url地址响应的回调函数,可以没有,没有表示响应不会进行回调函数的处理 -
follow
:连接提取器提取的url地址对应的响应是否还会继续被rules中的规则进行提取,True表示会,Flase表示不会
-
链接提取器LinkExtractor的更多常见参数
- allow: 满足括号中的’re’表达式的url会被提取,如果为空,则全部匹配
- deny: 满足括号中的’re’表达式的url不会被提取,优先级高于allow
- allow_domains: 会被提取的链接的domains(url范围),如:
['hr.tencent.com', 'baidu.com']
- deny_domains: 不会被提取的链接的domains(url范围)
-
restrict_xpaths: 使用xpath规则进行匹配,和allow共同过滤url,即xpath满足的范围内的url地址会被提取,如:
restrict_xpaths='//div[@class="pagenav"]'