当前位置: 首页 > news >正文

爬虫基础知识

一、Scrapy

1、cookie设置

目前cookie的设置不支持在headers进行设置, 需要通过以下三种方式进行设置:
第一种:setting文件中设置cookie

  • COOKIES_ENABLED是注释的时候,scrapy默认没有开启cookie。
  • COOKIES_ENABLED没有注释设置为False的时候,scrapy默认使用了settings里面的cookie。
  • COOKIES_ENABLED设置为True的时候,scrapy就会把settings的cookie关掉,使用自定义cookie。

注意:

  • 当使用settings的cookie的时候,又把COOKIES_ENABLED设置为True,scrapy就会把settings的cookie关闭,而且也没使用自定义的cookie,会导致整个请求没有cookie,导致获取数据失败。
  • 如果使用自定义cookie就把COOKIES_ENABLED设置为True
  • 如果使用settings的cookie就把COOKIES_ENABLED设置为False

第二种:middlewares中设置cookie
在middlewares中的downloadermiddleware中的process_request中配置cookie,配置如下:

request.cookies=
{'Hm_lvt_a448cb27ae2acb9cdb5f92e1f0b454f3': '1665643660', 
' _ga': 'GA1.1.755852642.1665643660'
}

注意:cookie内容要以键值对的形式存在
第三种:在spider爬虫主文件中,重写start_request方法,在scrapy的Request函数的参数中传递cookies
重载start_requests方法

   def start_requests(self):
       headers = {
                   "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) Gecko/20100101 Firefox/44.0"
                   }
       # 指定cookies
       cookies = 
       {
       'Hm_lvt_a448cb27ae2acb9cdb5f92e1f0b454f3': '1665643660', 
       ' _ga': 'GA1.1.755852642.1665643660'
       }

2、Get请求带参数

yield scrapy.FormRequest(
    url=url,
    method='GET',
    formdata=params,
    callback=self.parse_result
)

3、 meta拷贝

scrapy中的yield scrapy.Request 在传递item 的注意点
在需要多次调用下面这个parse() 方法的时候,会出现获取到最后一个meta的情况,而且是循环调用最后一个,就像yield 这一部分是个for循环,但是下面的parse方法不再循环内,所以就只能一直调用到最后一个meta. 这是时候需要deepcopy(meta)

4、start_requests或者start_urls多个请求只请求第一个

默认情况下,scrapy防止重复请求。由于在起始url中只有参数不同,scrapy会将起始url中的其余url视为第一个url的重复请求。这就是为什么你的蜘蛛在获取第一个url后停止。为了解析其余的url,我们在scrapy请求中启用了dont_filter标志。
修改前:

    def start_requests(self):
        for i in range(10):
            yield scrapy.Request('https://baidu.com', self.parse, meta={"seq": i})

修改后:

    def start_requests(self):
        for i in range(10):
            yield scrapy.Request('https://baidu.com', self.parse, meta={"seq": i}, dont_filter=True)

参考资料
https://www.jianshu.com/p/de3e0ed0c26b

相关文章:

  • LeetCode 0525. 连续数组:哈希表 + 前缀和
  • 隐私计算 FATE - 多分类神经网络算法测试
  • 【蓝桥杯Web】第十四届蓝桥杯(Web 应用开发)模拟赛 2 期 | 精品题解
  • 【web渗透思路】敏感信息泄露(网站+用户+服务器)
  • vue.js毕业设计,基于vue.js前后端分离教室预约小程序系统设计与实现
  • 2022第8届中国大学生程序设计竞赛CCPC威海站, 签到题7题
  • 微信小程序|搭建一个博客小程序
  • Spring:AOP通知获取数据(13)
  • 使用 Spring Boot 设置 Hibernate Envers
  • 【数据结构】带头节点双向循环链表
  • 原来 GitHub 不仅能学代码,还有这些东西
  • 【动手学深度学习】softmax回归的从零开始实现(PyTorch版本)(含源代码)
  • 为了摸鱼,我开发了一个工具网站
  • Qt编写ERP库存库房发货电子看板
  • 「PAT乙级真题解析」Basic Level 1086 就不告诉你 (问题分析+完整步骤+伪代码描述+提交通过代码)
  • JavaScript 如何正确处理 Unicode 编码问题!
  • .pyc 想到的一些问题
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • CSS 专业技巧
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Docker 笔记(2):Dockerfile
  • IndexedDB
  • java 多线程基础, 我觉得还是有必要看看的
  • jdbc就是这么简单
  • Logstash 参考指南(目录)
  • npx命令介绍
  • Vue学习第二天
  • Vue组件定义
  • 构造函数(constructor)与原型链(prototype)关系
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 盘点那些不知名却常用的 Git 操作
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 2017年360最后一道编程题
  • PostgreSQL之连接数修改
  • "无招胜有招"nbsp;史上最全的互…
  • # include “ “ 和 # include < >两者的区别
  • #预处理和函数的对比以及条件编译
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (Forward) Music Player: From UI Proposal to Code
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • **PHP二维数组遍历时同时赋值
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET的数据绑定
  • .NET关于 跳过SSL中遇到的问题
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @31省区市高考时间表来了,祝考试成功
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [51nod1610]路径计数
  • [Android实例] 保持屏幕长亮的两种方法 [转]