爬虫基础知识

news/2024/7/19 12:23:30 标签: 爬虫

一、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、 item数据只有最后一条

只显示主页数据中爬到的最后一条数据,其他都正常
在这里插入图片描述
这是我对标签进行遍历时,将item对象放置在了for循环的外部。修改代码就好
修改前:
在这里插入图片描述
修改后:
在这里插入图片描述
成功
在这里插入图片描述
scrapy中的yield scrapy.Request 在传递item 的注意点, 或者使用deepcopy

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

默认情况下,scrapy防止重复请求。由于在起始url中只有参数不同,scrapy会将起始url中的其余url视为第一个url的重复请求。这就是为什么你的spider在获取第一个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)

5、数据流

在这里插入图片描述
Scrapy中的数据流是由执行引擎控制的,它是这样的:

  1. Engine <component-engine>方法获取要来自Spider <component-spiders>爬取的初始请求。
  2. Engine <component-engine> 将请求交给Scheduler <component-scheduler> 调度,并向Scheduler <component-scheduler> 索取下一个抓取请求。
  3. Scheduler <component-scheduler> 从队列中返回下一个请求给Engine <component-engine>
  4. Engine <component-engine> 通过Downloader middleware <component-download -middleware将请求发送给Downloader <component-downloader>
  5. 一旦页面完成下载,Downloader <component-downloader> 生成一个响应(带有该页面)并将其发送给引擎,传递给Downloader middleware <component-download -middleware
  6. Engine <component-engine> Downloader <component-downloader> 接收响应,并将其通过Spider Middleware <component- Spider Middleware发送到Spider <component- Spider > 进行处理。
  7. Spider <component- Spider > 处理响应,并通过Spider Middleware <component- Spider MiddlewareEngine <component-engine>返回抓取items和新请求。
  8. Engine <component-engine> 将已处理的items发送到Item pipeline <component-pipeline > ,然后将已处理的请求发送到Scheduler <component-scheduler> ,并请求可能的下一个请求进行爬取。
  9. 该过程重复(从步骤3开始),直到不再有来自Scheduler <component-scheduler> 的请求。

6、组件

Scrapy Engine
引擎负责控制系统所有组件之间的数据流,并在某些操作发生时触发事件。

Scheduler
scheduler <topics-scheduler> 从引擎接收请求,并将它们入队列,以便在引擎请求它们时稍后提供它们(也提供给引擎)。

Downloader
Downloader负责获取网页并将其提供给引擎,而引擎又将其提供给spiders。

Spiders
spider是由Scrapy用户编写的自定义类,用于解析响应并从中提取items <topics-items>或要发送的其他请求。

Item Pipeline
The Item Pipeline负责处理被spiders提取(或刮取)的items。典型的任务包括清理、验证和持久化(比如将items存储在数据库中)。

Downloader middlewares
下载器中间件是位于引擎和下载器之间的特定钩子,当请求从引擎传递到下载器时处理请求,并处理从下载器传递到引擎的响应。
如果需要执行以下操作之一,请使用Downloader中间件:

  • 在请求被发送到Downloader之前处理它(即在Scrapy将请求发送到网站之前)。
  • 发送给spider之前更改响应。
  • 发送一个新的Request,而不是将收到的响应传递给spider
  • 在不获取网页的情况下将响应传递给爬行器
  • 默默地放弃一些请求。

Spider middlewares
Spider middlewares是位于引擎和Spiders之间的特定钩子,能够处理spider输入(responses)和输出(items 和 requests)。
如果有以下需要,可以使用Spider中间件:

  • spider回调输出的后处理,更改、增加、删除请求或items。
  • start_requests的后处理。
  • spider的异常处理。
  • 根据响应内容为某些请求调用errback而不是回调。

参考资料

https://www.jianshu.com/p/de3e0ed0c26b
https://blog.csdn.net/holmes369/article/details/104477183/
https://github.com/scrapy/scrapy/blob/master/docs/topics/architecture.rst
https://www.jianshu.com/p/8824623b551c


http://www.niftyadmin.cn/n/11258.html

相关文章

ASCII码与字符对照表(附转换代码)

目录 ASCII基本字符 ASCII控制字符 ASCII可显示字符 ASCII扩展字符 转换代码 ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础ASCII码&#xff0c;使用 7 位二进制数来表示所有的大写和小写字母、数字 0 到 9、标点符号…

ShareSDK for Flutter

前言 这是一个基于ShareSDK功能的扩展的Flutter插件。使用此插件能够帮助您在使用Flutter开发应用时,快速地实现社会化功能,例如第三方授权登录,获取用户信息以及社交平台的分享等功能。 Demo例子&#xff1a;https://github.com/MobClub/ShareSDK-For-Flutter 开始集成 引入…

c语言:初识结构体

初识结构体一.结构体声明1.结构体的概念2.声明二.结构体的基础使用三.结构体变量的定义和初始化一.结构体声明 1.结构体的概念 结构体是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量 这里与数组做出区分&#xff1a;数组是一组相同类型元…

JVM垃圾回收——CMS垃圾收集器

目录 一、什么是CMS垃圾收集器 二、CMS垃圾收集的过程 三、CMS收集器的不足 四、CMS收集器的参数配置 一、什么是CMS垃圾收集器 虽然HotSpot虚拟机已经在jdk14中移除了CMS垃圾收集的参数&#xff0c;但是考虑到还有很多开发是基于jdk8开发的&#xff0c;所以还是有必要了解…

79.Zabbix之Ping监控

在做Ping监控之前,看看有哪些常用的键值Key及这些Key的说明 1、简单检查支持的键值Key icmpping[<target>,<packets>,<interval>,<size>,<timeout>] icmppingloss[<target>,<packets>,<interval>,<size>,<timeou…

专利如果申请?成功率如何提高?

问题一&#xff1a;专利如何申请&#xff1f;​ 1、整理技术方案&#xff0c;整理一套属于你的创新技术方案&#xff1b; 2、专利检索&#xff0c;确保你的创新没有被别人申请过&#xff1b; 3、撰写专利申请书&#xff0c;为了快速审查&#xff0c;做好长期专利布局&#x…

java毕业生设计中华二十四节气文化传承宣展平台计算机源码+系统+mysql+调试部署+lw

java毕业生设计中华二十四节气文化传承宣展平台计算机源码系统mysql调试部署lw java毕业生设计中华二十四节气文化传承宣展平台计算机源码系统mysql调试部署lw本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xff1a;idea…

MySQL数据类型

MySQL 数据类型 数据类型在数据库中非常重要&#xff0c;对数据类型的选择将会影响数据库的性能&#xff0c;除此之外&#xff0c;在数据库中使用了不是非常合适的数据类型可能会对后期维护造成麻烦。在选择数据类型时&#xff0c;必须格外谨慎&#xff0c;因为在生产环境下更…