CrawlSpider是继承了Spider的全站爬虫类。CrawlSpider类定义了一些规则(rule)来提供跟进提取出来的网址link的方便的机制,更适合从爬取的网页中获取新的link并继续爬取的工作。
scrapy genspider -t crawl 爬虫名
rules = (
Rule(LinkExtractor(allow=r'http://bang\.dangdang\.com/books/bestsellers/.*?'),
callback='parse_item',
follow=True)
)
# callback , 回调函数
# follow ,是否继续追踪
LinkExtractor主要参数:
1 allow
接收一个正则表达式或一个正则表达式列表,提取绝对url与正则表达 式匹配的链接。如果该参数为空(默认),就提取全部链接。
2 deny
接收一个正在则表达式或一个正则表达式列表,与allow相反,排除绝 对url与正则表达式匹配的链接。
3 allow_domains
会被提取的链接的domains。相当于域名白名单。
4 deny_domains
一定不会被提取链接的domains。相当于域名黑名单。
5 restrict_xpaths
使用xpath表达式,和allow共同作用过滤链接。表示从当前页面中XPath匹配区域提取链接。这个值是XPath表达式或者是XPath表达式列表。
Rule参数解释:
1 link_extractor:
是一个Link Extractor对象。其定义了如何从爬取到的页面提取链接。
2 callback:
是一个callable或string(该Spider中同名的函数将会被调用)。从link_extractor 中每获取到链接时将会调用该函数。该回调函数接收一个response作为其第一个参数, 并返回一个包含Item以及Request对象(或者这两者的子类)的列表。
3 cb_kwargs:
包含传递给回调函数的参数(keyword argument)的字典。
4 follow:
是一个boolean值,指定了根据该规则从response提取的链接是否需要跟进。如果 callback为None,follow默认设置True,否则默认False。
5 process_links:
是一个callable或string(该Spider中同名的函数将会被调用)。从link_extrator中获 取到链接列表时将会调用该函数。该方法主要是用来过滤。
6 process_request:
是一个callable或string(该spider中同名的函数都将会被调用)。该规则提取到的每 个request时都会调用该函数。该函数必须返回一个request或者None。用来过滤 request。
# 自定义指纹过滤器,将指纹存入redis中
from scrapy.utils.request import request_fingerprint
from scrapy.dupefilters import BaseDupeFilter
import redis
class Mydupefilters(BaseDupeFilter):
# 初始化数据库
def __init__(self, host, port, db, passwd):
self.myredis = redis.StrictRedis(host=host, port=port,
db=db, password=passwd)
# 从settings中获取参数
@classmethod
def from_settings(cls, settings):
return cls(
host=settings["REDIS_HOST"],
port=settings["REDIS_PORT"],
db=settings["REDIS_DB"],
passwd=settings["REDIS_PWD"]
)
# 保存到redis中,不要修改方法名
def request_seen(self, request):
fp = request_fingerprint(request)
KEY = "key"
if not self.myredis.sismember(KEY, fp):
self.myredis.sadd(KEY, fp)
return False
return True
# 激活指纹过滤器
DUPEFILTER_CLASS = 'tencentcrawlspider.mydupefilters.Mydupefilters'