网页视频抓取浏览器( scrapy调度器的处理方法和处理的方法)
优采云 发布时间: 2022-01-21 08:14网页视频抓取浏览器(
scrapy调度器的处理方法和处理的方法)
1.scrapy 框架有多少个组件/模块?
Scrapy Engine:这是引擎,负责Spiders、ItemPipeline、Downloader、Scheduler、信号、数据传输等等之间的通信!(像人体?)
调度器(Scheduler):负责接受引擎发送的请求,并按一定的方式安排,加入队列,等待来自Scrapy Engine(引擎)的请求,交给引擎。
Downloader(下载器):负责下载Scrapy Engine(引擎)发出的所有Requests请求,并将得到的Responses返回给Scrapy Engine(引擎),交给Spiders引擎处理,
Spiders:负责处理所有的Response,分析并从中提取数据,获取Item字段需要的数据,将需要跟进的URL提交给引擎,再次进入Scheduler。
Item Pipeline:负责处理从Spiders获取的Item,并对其进行处理,如去重、持久化存储(保存数据库、写入文件,总之就是用来保存数据的)
Downloader Middlewares:可以把它看成一个可以自定义和扩展下载功能的组件
2.scrapy 工作流程的简要说明。
整个 Scrapy 的数据流:
程序运行时,
发动机:嗨!蜘蛛,你在对付哪个网站?
蜘蛛:我必须对付
引擎:给我你需要的第一个处理的 URL。
蜘蛛:给你的第一个网址是
发动机:嗨!调度员,我这里有一个请求,请帮我排序并加入队列。
调度程序:好的,正在处理您等一下。
发动机:嗨!调度员,给我你处理过的请求,
调度器:给你,这是我处理的请求
发动机:嗨!下载器,帮我根据下载中间件的设置下载这个请求
下载者:好的!给你,这是下载的东西。(如果失败:对不起,这个请求下载失败,然后引擎告诉调度器这个请求下载失败,你记录一下,我们稍后下载。)
发动机:嗨!蜘蛛,这是下载的东西,已经按照蜘蛛中间件处理了,你可以处理(注意!这里的响应默认由def parse函数处理)
蜘蛛:(对于处理数据后需要跟进的URL),您好!引擎,这是我需要跟进的 URL,并将其响应传递给函数 def xxxx(self,responses) 进行处理。这就是我得到的物品。
发动机:嗨!项目管道我这里有一个项目,请帮我处理它!调度器!这是我需要你帮我处理的 URL。然后从第4步循环,直到你得到你需要的信息,注意!只有当调度器中没有请求时,整个程序才会停止,(即对于下载失败的URL,Scrapy会重新下载。)
3.scrapy指纹去重原理和scrapy-redis去重原理?
Scrapy的去重原理流程:使用哈希值和集合去重。首先创建fingerprint = set() 组合,然后使用请求对象的sha1对象来消化信息。摘要完成后,判断哈希值是否在集合中。如果是,则返回 true,如果不是,则将其添加到集合中。
scrapy-redis的去重原理基本相同,只是持久化存储在redis共享数据库中。当请求的数据达到10亿级以上时,此时会消耗大量内存。一个 40 字节的 sha1 会占用 40G 的内存,大部分存储这个数据的数据库都无法承受。这时候应该使用布隆过滤器。
4.请简单介绍一下scrapy框架。
scrapy 是一个快速、高级的基于 python 的网络爬虫框架,用于爬取网站并从页面中提取结构化数据。scrapy 使用 Twisted 异步网络库来处理网络通信。
5.为什么要使用scrapy框架?scrapy框架有什么优势?
更容易构建*敏*感*词*的抓取项目
它异步处理请求并且非常快
采用自动调节机构,可自动调节爬行速度
6.scrapy如何实现分布式爬取?
它可以在 scrapy_redis 类库的帮助下实现。
分布式爬虫时,会有master和slave,其中master是核心服务器,slave是具体的爬虫服务器。
我们在主服务器上搭建一个redis数据库,将要爬取的url存储在redis数据库中。所有从爬虫服务器在爬取时都从redis数据库链接。由于scrapy_redis自身的队列机制,slave获取的url不会相互冲突,然后最终将获取到的结果存入数据库。捕获的 URL 的指纹也存储在 master 的 redis 数据库中以进行重复数据删除。相关代码可以在 dupefilter.py 文件中的 request_seen() 方法中找到。
去重问题:
dupefilter.py 中的源代码:
def request_seen(self, request):
fp = request_fingerprint(请求)
添加 = self.server.sadd(self.key, fp)
返回未添加
去重是通过将请求的指纹存储在redis上来实现的。
7.使用scrapy 和requests?
请求是轮询的,会被网络阻塞,不适合爬取大量数据
scapy底层是twisted异步框架,并发是最大优势
8.爬虫用多线程好不好?还是更多进程?为什么?
对于IO密集型代码(文件处理、网络爬虫),多线程可以有效提高效率(单线程下的IO操作会导致IO等待,会造成不必要的等待时间。启用多线程后,当线程A等待,会自动切换到线程B,不会浪费CPU资源,从而提高程序执行效率)。
在实际的采集进程中,要设置多进程或多线程,不仅要考虑网速和相应的问题,还要考虑本机硬件的情况。
9.了解哪些基于爬虫的模块?
网络请求:urllib、requests、aiohttp
数据解析:re、xpath、bs4、pyquery
硒
js反向:pyexcJs
10.列举爬取过程中遇到哪些比较难的反爬机制?
动态加载的数据
动态改变请求参数
js加密
演戏
饼干
11.简述如何抓取动态加载数据?
基于抓包工具的全局搜索
如果动态加载的数据是密文,则无法搜索到全局搜索
12.如何抓取手机数据?
提琴手,appnium,网络配置
13.如何实现全站数据爬取?
基于手动请求发送+递归解析
基于 CrwalSpider (LinkExtractor, Rule)
14.如何提高爬取数据的效率?
使用框架
线程池,多任务异步协程
分散式
15.列出你接触的防爬机制?
从功能上来说,爬虫一般分为数据采集、处理、存储三部分。这里我们只讨论 data采集 部分。
一般网站反爬虫从三个方面:用户请求的头文件、用户行为、网站目录和数据加载方式。前两种比较容易遇到,从这些角度来看,大部分网站都是反爬虫。会使用第三种使用ajax的网站,增加了爬取的难度。
1)通过Headers反爬虫
反爬取用户请求的头部是最常见的反爬取策略。很多网站会检测Headers的User-Agent,有的网站会检测Referer(有些资源的防盗链网站就是检测Referer)。如果遇到这样的反爬虫机制,可以直接在爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者将Referer值改为目标网站域名。对于检测Headers的反爬虫,在爬虫中修改或添加Headers可以很好的绕过。
2)基于用户行为的反爬虫
网站的另一部分是检测用户行为,比如同一IP在短时间内多次访问同一页面,或者同一账号在短时间内多次执行同一操作。大多数网站都是前一种情况,使用IP代理就可以了。可以专门写一个爬虫来爬取网上公开的代理ip,检测到后全部保存。这样的代理ip爬虫经常使用,最好自己准备一个。有大量代理IP,可以每隔几次更换一个IP,这在requests或者urllib2中很容易做到,这样就可以轻松绕过第一个反爬虫。
对于第二种情况,下一个请求可以在每个请求之后以几秒的随机间隔发出。一些有逻辑漏洞的网站可以通过多次请求、注销、重新登录、继续请求的方式绕过同一账号短时间内不能多次请求的限制。
3)动态页面的反爬虫
以上情况大多出现在静态页面中,也有一些网站,我们需要爬取的数据是通过ajax请求获取的,或者通过JavaScript生成的。首先使用 Firebug 或 HttpFox 分析网络请求。
如果我们能找到ajax请求并分析出具体参数和响应的具体含义,就可以使用上面的方法,直接使用requests或者urllib2来模拟ajax请求,分析响应json得到需要的数据。
能够直接模拟ajax请求获取数据是很棒的,但是有的网站把ajax请求的所有参数都加密了。我们根本无法构造对我们需要的数据的请求。我这几天爬的网站就是这样的。除了对ajax参数进行加密外,还封装了一些基础功能,都是调用自己的接口,接口参数是加密的。遇到这样的网站,我们就不能使用上面的方法了。我使用selenium+phantomJS框架调用浏览器内核,使用phantomJS执行js模拟人类操作,触发页面中的js脚本。从填表到点击按钮再到页面滚动,都可以模拟,不管具体的请求和响应过程,
使用这个框架几乎可以绕过大部分反爬虫,因为它不是冒充浏览器获取数据(上面提到的添加header在一定程度上是冒充浏览器),它本身就是浏览器,而且phantomJS 是一个没有界面的浏览器,但控制浏览器的不是人。使用selenium+phantomJS可以做很多事情,比如识别触摸类型(12306)或者滑动类型的验证码,页面表单的暴力破解等)。它还将在自动化渗透中发挥重要作用,并将在未来发挥作用。提到这一点。
16.什么是深度优先和广度优先(优缺点)
默认情况下,scrapy 是深度优先的。
深度优先:占用空间大,但跑得快。
广度优先:占用空间少,运行慢
17.知道谷歌的无头浏览器吗?
无头浏览器或无头浏览器是没有界面的浏览器。既然是浏览器,它应该有浏览器应该有的一切,却看不到界面。
Python中selenium模块中的PhantomJS是无界面浏览器(headless browser):它是基于QtWebkit的无头浏览器。
18.说说Scrapy的优缺点。
优势:
scrapy 是异步的
采用更具可读性的 xpath 而不是正则表达式
强大的统计和日志系统
同时爬取不同的网址
支持shell模式,方便独立调试
编写中间件,方便编写一些统一的过滤器
通过管道方式存储在数据库中
缺点:基于Python的爬虫框架,扩展性差
基于twisted框架,运行异常不会杀死reactor,异步框架出错后也不会停止其他任务,很难检测到数据错误。
19.需要登录的网页,如何解决ip、cookie、session同时限制?
解决IP的限制,可以使用代理IP地址池和服务器;如果动态爬取不适用,可以使用反编译的js文件获取对应的文件,或者切换到其他平台(如手机)看能否获取对应的json文件。.
20.验证码的解决方法?
1.输入验证码
解决方法:这个是最简单的,只要识别出里面的内容,然后在输入框内填写即可。这种识别技术叫做OCR,这里我们推荐使用Python的第三方库tesserocr。对于后面没有影响的验证码,可以通过这个库直接识别。但是对于背景嘈杂的验证码,直接识别的识别率会很低。这种情况下,我们需要先对图片进行处理,先对图片进行灰度化,然后二值化,再去识别,识别率会大大提高。
验证码识别大致步骤:
转换为灰度
去除背景噪音
图像分割
2.滑动验证码
解决方法:这种验证码比较复杂,但是有相应的方法。我们直接想到的就是模拟人拖动验证码的行为,点击按钮,然后看到缝隙的位置,最后把拼图拖到缝隙位置完成验证。
第一步:点击按钮。然后我们发现notch和puzzle在你没有点击按钮的时候并没有出现,只有在点击之后才出现,这给了我们寻找notch位置的灵感。
步骤 2:拖动到间隙位置。我们知道拼图应该拖到缺口处,但是这个距离怎么能用数值来表示呢?根据我们在第一步中观察到的情况,我们可以找到间隙的位置。这里我们可以比较两张图片的像素,设置一个参考值。如果某个位置的差异超过了参考值,那么我们就找到了两张图片的不同位置。当然,我们来自难题的右侧。它从侧面开始,从左到右。当找到第一个不同的位置时结束。这个位置应该是缝隙的左边,所以我们可以用selenium把它拖到这个位置。这里的另一个问题是如何自动保存这两个图像?这里我们可以先找到label,然后得到它的位置和大小,然后是top,bottom,left,right = location['y'] ,location['y']+size['height']+location['x'] + size['width'] ,然后截图,最后把这四个位置填上。具体使用可以查看selenium文档,点击按钮剪切图片,再点击剪切图片。最后,拖动时,需要模拟人类行为,先加速后减速。因为这种验证码有行为特征检测,所以人不可能一直保持匀速,否则会判断机器在拖拽,所以不会通过验证。可以查看selenium文档,点击按钮剪切图片,再点击剪切图片。最后,拖动时,需要模拟人类行为,先加速后减速。因为这种验证码有行为特征检测,所以人不可能一直保持匀速,否则会判断机器在拖拽,所以不会通过验证。可以查看selenium文档,点击按钮剪切图片,再点击剪切图片。最后,拖动时,需要模拟人类行为,先加速后减速。因为这种验证码有行为特征检测,所以人不可能一直保持匀速,否则会判断机器在拖拽,所以不会通过验证。
3.点击文本验证和图标选择
图文验证:通过文字提醒用户点击图片中相同单词的位置进行验证。
图标选择:给定一组图片,根据需要单击其中的一个或多个。借识别万物之难挡机器。
这两个原理是类似的,只是一个是给文字,点击图片中的文字,另一个是给图片,点击内容相同的图片。
这两种方法都不是特别好。您只能使用第三方识别接口来识别相同的内容。推荐一个超级鹰,发送验证码,会返回对应的点击坐标。然后使用 selenium 模拟点击。图片的获取方法同上面的方法。
21.如何破解滑动验证码?
破解核心思想:
1、如何判断滑块滑动多远?
滑块的滑动距离,需要检测验证码图片的间隙位置
滑动距离=终点坐标-起点坐标
那么问题就变成了我们需要截图,根据selenium中的位置方法,做一些坐标计算得到我们需要的位置
2、我们如何获得坐标?
起点坐标:
每次运行程序,位置都是固定的,滑块左边框距离验证码图片左边框6px。
终点坐标:
每次运行程序,位置都会发生变化,我们需要计算每个间隙的位置
如何计算终点是间隙的位置?
我们先举个例子。比如下面两张图片是120x60的图片,一张是纯色的图片,一张是有蓝线的图片(蓝线的位置是提前设置为60px的),我现在让你编程确定蓝线的位置,如何确定?
回答:
遍历所有像素点的颜色值,找到颜色值不同的点的位置,确定蓝线的位置
这句话怎么理解?点击下图,你有没有发现图片是由一个个像素组成的?对于 120×60 的图片,对应的像素为横轴 120 像素,纵轴 60 像素。我们需要遍历两张图片的坐标,比较颜色值,从(0,0)(0,1)...直到(120,60)),开始比较两者图片) 的颜色值,如果颜色值不同,我们可以回到这个位置
22.数据是如何存储的?
以 json 格式保存到文本文件
这是最简单、最方便、最常用的存储方法。json 格式确保您在打开文件时可以直观地检查存储的数据。一个数据存储在一行中。此方法适用于爬取少量数据。,后续的阅读分析也很方便。
保存到excel
如果爬取的数据很容易组织成表格的形式,那么将其存储在excel中是一个不错的选择。打开excel后,观察数据更方便。Excel也可以做一些简单的操作,可以用xlwt来写excel。在这个库中,xlrd 可以用来读取 excel。和方法一一样,excel中存储的数据不宜过多。另外,如果是多线程爬取,多线程写excel是不可能的。这是一个限制。
存储到 sqlite
sqlite不需要安装,是零配置的数据库,比mysql轻很多。语法方面,只要你懂mysql,操作sqlite是没有问题的。当爬虫数据量大,需要持久化存储,又懒得安装mysql的时候,sqlite绝对是最好的选择,不多,不支持多进程读写,所以不适合多进程爬虫。
存储到mysql数据库
MySQL 可以远程访问,但是 sqlite 不能,这意味着您可以将数据存储在远程服务器主机上。当数据量很大的时候,自然会选择mysql而不是sqlite,但是不管是mysql还是sqlite,在存储数据之前先建表,根据要抓取的数据结构和内容定义字段,这是耐心和精力的问题
存储到 mongodb
我最喜欢nosql数据库的原因之一是不需要像关系数据库那样定义表结构,因为定义表结构很麻烦。要确定字段的类型,varchar 类型的数据也需要定义长度。, 数据过长会被截断。
mongodb 以文档的形式存储数据。可以使用pymongo库直接将数据以json格式写入mongodb。即使是同一个集合,对数据的格式也没有要求,太灵活了。
刚刚捕获的数据通常需要清洗两次才能使用。如果使用关系型数据库存储数据,第一次需要定义表结构。清洗后,恐怕需要定义一个表结构来重新创建清洗后的数据。存储,太繁琐,使用mongodb省去了重复定义表结构的过程。
23.cookie过期有什么问题?
此时,cookie 需要自动更新。cookie 通常如何自动更新?这里将使用硒。
步骤1、使用selenium自动登录获取cookies并保存到文件中;
Step 2、 读取cookie,比较cookie的有效期,过期则再次执行步骤1;
Step 3、 请求其他网页时,填写cookie,保持登录状态。
24.Selenium 和 PhantomJS
硒
Selenium 是用于 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户一样。支持的浏览器包括IE(7、8、9、10、11)、Mozilla Firefox、Safari、Google Chrome、Opera等主流浏览器。该工具的主要功能包括:测试与浏览器的兼容性
- 测试您的应用程序,看看它是否在不同的浏览器和操作系统上运行良好。
它的功能是:
框架底层使用 JavaScript 模拟真实用户操作浏览器。执行测试脚本时,浏览器会自动根据脚本代码进行点击、进入、打开、验证等操作,就像真实用户一样,站在最终用户的角度对应用进行测试。
使自动化浏览器兼容性测试成为可能,尽管浏览器之间仍然存在细微差别。
使用简单,用例脚本可以用Java、Python等多种语言编写。
也就是说,它可以像真人一样根据指令访问浏览器,比如打开网页、截图等功能。
幻影
(新版本的 selenium 已经开始弃用 phantomjs,但有时我们可以单独使用它)是一个基于 Webkit 的无界面浏览器,将 网站 内容加载到内存中并执行页面上的各种脚本(如 js)。
25.如何判断网站是否更新?