A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谷粒姐姐 黑马粉丝团   /  2018-11-26 16:51  /  1237 人查看  /  0 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

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
        • [AppleScript] 纯文本查看 复制代码
          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的集合中

          生成指纹
        • [AppleScript] 纯文本查看 复制代码
          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的集合中,不存在插入
        • [AppleScript] 纯文本查看 复制代码
          added = self.server.sadd(self.key, fp)
          return added != 0






0 个回复

您需要登录后才可以回帖 登录 | 加入黑马