回顾之前的代码中,我们有很大一部分时间在寻找下一页的url地址或者是内容的url地址上面,这个过程能更简单一些么?
对应的crawlspider就可以实现上述需求,能够匹配满足条件的url地址,组装成Reuqest对象后自动发送给引擎,同时能够指定callback函数
即:crawlspider爬虫可以按照规则自动获取连接
通过crawlspider爬取豆瓣TOP250详情页的信息
url:https://movie.douban.com/top250
scrapy startproject project
cd project
scrapy genspider -t crawl douban book.douban.com/latest?subcat=%E5%85%A8%E9%83%A8&p=1
url: 豆瓣图书 https://book.douban.com/latest?subcat=%E5%85%A8%E9%83%A8&p=1
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class BookSpider(CrawlSpider):
name = 'douban'
# allowed_domains = ['https://movie.douban.com/top250']
start_urls = ['https://movie.douban.com/top250']
# 匹配页码地址
link = LinkExtractor(allow=r'start=\d+&filter=')
# 匹配详情页地址
link_detail = LinkExtractor(allow=r'https://movie.douban.com/subject/\d+/')
# allow值什么都不写 则为提取所有的url
link_all = LinkExtractor(allow=r'')
rules = (
# Rule(link, callback='parse_item', follow=True),
# Rule(link_detail, callback='parse_detail_item', follow=False),
Rule(link_all, callback='parse_all_item', follow=True),
)
def parse_item(self, response):
item = {}
print(response)
return item
def parse_detail_item(self, response):
item = {}
print(response)
return item
def parse_all_item(self, response):
item = {}
print(response)
return item
在crawlspider爬虫中,没有parse函数
scrapy genspider -t crawl <爬虫名> <allowed_domail>
创建一个crawlspider的模板,页可以手动创建链接提取器LinkExtractor的更多常见参数
allow: 满足括号中的’re’表达式的url会被提取,如果为空,则全部匹配
deny: 满足括号中的’re’表达式的url不会被提取,优先级高于allow
allow_domains: 会被提取的链接的domains(url范围),如:['https://movie.douban.com/top250']
deny_domains: 不会被提取的链接的domains(url范围)
restrict_xpaths: 使用xpath规则进行匹配,和allow共同过滤url,即xpath满足的范围内的url地址会被提取
如:restrict_xpaths='//div[@class="pagenav"]'
restrict_css: 接收一堆css选择器, 可以提取符合要求的css选择器的链接
attrs: 接收一堆属性名, 从某个属性中提取链接, 默认href
tags: 接收一堆标签名, 从某个标签中提取链接, 默认a, area
值得注意的, 在提取到的url中, 是有重复的内容的. 但是我们不用管. scrapy会自动帮我们过滤掉重复的url请求
模拟使用
正则用法: links1 = LinkExtractor(allow=r’list_23_\d+.html’)
xpath用法: links2 = LinkExtractor(restrict_xpaths=r’//div[@class=“x”]')
css用法: links3 = LinkExtractor(restrict_css=‘.x’)
5.提取连接
Rule常见参数