python爬虫笔记-day7

crawlspider的使用
常见爬虫 scrapy genspider -t crawl 爬虫名 allow_domain
指定start_url,对应的响应会进过rules提取url地址
完善rules,添加Rule Rule(LinkExtractor(allow=r'/web/site0/tab5240/info\d+.htm'), callback='parse_item'),
注意点:
url地址不完整,crawlspider会自动补充完整之后在请求
parse函数不能定义,他有特殊的功能需要实现
callback:连接提取器提取出来的url地址对应的响应交给他处理
follow:连接提取器提取出来的url地址对应的响应是否继续被rules来过滤
request对象什么时候入队
dont_filter = True ,构造请求的时候,把dont_filter置为True,该url会被反复抓取(url地址对应的内容会更新的情况)
一个全新的url地址被抓到的时候,构造request请求
url地址在start_urls中的时候,会入队,不管之前是否请求过
构造start_url地址的请求时候,dont_filter = True

def enqueue_request(self, request):
if not request.dont_filter and self.df.request_seen(request):

dont_filter=False Ture True request指纹已经存在 #不会入队

    # dont_filter=False Ture  False  request指纹已经存在 全新的url  #会入队
    # dont_filter=Ture False  #会入队
    self.df.log(request, self.spider)
    return False
self.queue.push(request) #入队
return True

scrapy_redis去重方法
使用sha1加密request得到指纹
把指纹存在redis的集合中
下一次新来一个request,同样的方式生成指纹,判断指纹是否存在reids的集合中

生成指纹

fp = hashlib.sha1()
fp.update(to_bytes(request.method)) #请求方法
fp.update(to_bytes(canonicalize_url(request.url))) #url
fp.update(request.body or b'') #请求体
return fp.hexdigest()

判断数据是否存在redis的集合中,不存在插入

added = self.server.sadd(self.key, fp)
return added != 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值