网页视频抓取浏览器( 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.如何判断网站是否更新?

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线