爬虫scrapy框架的基本使用

本文深入解析Scrapy爬虫框架的工作流程,包括数据传递、项目创建、请求构造、Item使用及模拟登录等核心功能。同时,介绍了Scrapy与Scrapy-Redis结合使用时的request入队条件,为爬虫开发者提供全面的技术指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

scrapy 的数据传递的流程

  • 调度器 request对象—》引擎—》下载器中间件—》下载器
  • 下载器发送请求,获取response—》下载器中间件–》引擎—》爬虫中间件—》爬虫
  • 怕从–》提取url,组成一个request对象—》爬虫中间件—》引擎—》调取器
  • 爬虫—》提取数据—》引擎–》管道
  • 管道实现数据的处理和保存

scrapy的项目流程

  • 创建项目 :scrapy startproject 项目名
  • 创建爬虫:cd 项目名下 ,scrapy genspider 爬虫名 allowed_domains
  • 完善爬虫 :提取数据,提取url地址组成request
  • 完善管道:数据的处理和保存

scrapy如何构造请求

  • scrapy.Request(url,callback,meta,dont_filter)
    • url:详情页,下一页的url
    • callback:url地址响应的处理函数
    • meta:在不同的函数中传递数据
    • dont_filter :默认值false,过滤请求,请求过的不会再被请求,为True,表示会被继续请求
  • yield scrapy.Request(url,callback,meta,dont_filter)

scrapy的Item如何使用

#定义
class Item(scrapy.Item):
  name = scrapy.Field()  

#使用
导入。使用name字典

scrapy中parse函数是做什么的

  • 处理start_urls中的url地址的响应

crwalspider

  • 创建命令:Scrapy genspider -t crawl 爬虫名 允许爬去的范围
  • Rule中:
    • callback:连接提取器提取的url地址的响应的处理函数
    • follow:连接提取器提取的url地址的响应是否会继续被Rule来提取数据

下载器中间件

  • 使用代理
    • request.meta[‘proxy’] = “协议+ip+端口”
  • process_request(request,spider)
    • return None ,请求继续被下载器执行
    • return resposne ,response直接返回给引擎交给爬虫
    • return request, request通过引擎交给调度器
  • process_response(request,response,spider)
    • return response ,通过引擎交给爬虫
    • return request ,通过引擎交给调度器

模拟登陆之携带cookie

  • cookie字典传递给请求的cookies参数

    yield scrapy.Request(
                  url,
                  callback=self.parse,
                  cookies=cookie_dict,
                  # headers = {"Cookie":cookies_str}
              )
    

模拟登陆之发送post请求

yield scrapy.FormRequest(
            "https://github.com/session", #url
            formdata=formdata,  #请求体
            callback=self.parse_login
        )

模拟登录之表单提交

#发送请求
yield scrapy.FormRequest.from_response(
    response,
    formdata=formdata,
    callback = self.parse_login
)

正则比倒是忽略大小写

  • re.I/re.IGNORECASE
    scrapy 实现生成指纹的方法

默认使用sha1加密了请求方法,请求体,和请求url地址,得到16进制字符串

fp = hashlib.sha1()
fp.update(to_bytes(request.method))
fp.update(to_bytes(canonicalize_url(request.url)))
fp.update(request.body or b'')

cache[include_headers] = fp.hexdigest()  #指纹

要查看数据是否存在于redis的集合中,如果不存在就插入

added = self.server.sadd(self.key, fp)
#added= 0 表示存在
#added!=0 表示不存在,并且已经插入
return added == 0

scrapy_redis和scrapy中request入队的条件

  • request对象没见过,新的request
  • dont_filter = True 不过滤的情况下会反复抓取
  • start_urls 中的url能够被反复抓取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值