抓取网页数据违法吗( scrapy调度器的处理方法和处理的方法)

优采云 发布时间: 2021-09-28 07:25

  抓取网页数据违法吗(

scrapy调度器的处理方法和处理的方法)

  1.scrapy 框架有哪些组件/模块?

  Scrapy Engine:这个引擎,负责Spider、ItemPipeline、Downloader、Scheduler之间的通讯、信号、数据传输!(它看起来像人体吗?)

  Scheduler:负责接受引擎发送的请求,按照一定的方式排序,入队,等待Scrapy Engine请求,然后交给引擎。

  Downloader:负责下载Scrapy Engine发送的所有Requests,并将得到的Responses返回给Scrapy Engine,交给Spiders进行处理。

  Spiders:负责处理所有的Responses,从中分析提取数据,获取Item字段需要的数据,将需要跟进的URL提交给引擎,再次进入Scheduler,

  Item Pipeline:负责处理Spiders中获取到的Item,以及去重、持久化存储等处理(存储数据库,写入文件,总之就是用来保存数据的)

  下载器中间件:可以将其视为可以自定义和扩展下载功能的组件

  2. 简单说说scrapy的工作流程。

  整个 Scrapy 的数据流:

  程序运行时,

  发动机:喂!蜘蛛,你想对付哪一只网站?

  蜘蛛:我必须处理

  引擎:给我第一个需要处理的网址。

  蜘蛛:你的第一个 URL 是

  发动机:喂!调度员,我有一个请求,请帮我整理一下队伍。

  调度员:好的,正在处理中,请稍等。

  发动机:喂!调度员,把你处理过的请求给我,

  调度员:给你,这是我处理的请求

  发动机:喂!下载器,你可以根据下载中间件的设置为我下载这个请求

  下载者:好的!给你,这是下载的东西。(如果失败:对不起,这个请求的下载失败,然后引擎告诉调度器这个请求的下载失败,你记录下来,我们稍后再下载。)

  发动机:喂!Spiders,这个是下载的东西,已经按照Spider中间件处理过,可以处理(注意!这里的响应默认是由def解析函数处理的)

  蜘蛛:(处理完数据后需要跟进的网址),嗨!引擎,这是我需要跟进的URL,并将其响应交给函数def xxxx(self,responses)进行处理。这是我得到的物品。

  发动机:喂!物品管道我这里有物品,你可以帮我处理!调度程序!这是我需要的网址。你可以替我处理。然后从第四步开始循环,直到得到你需要的信息,注意!只有当调度器中没有请求时,整个程序才会停止,(即对于下载失败的 URL,Scrapy 会重新下载。)

  3.Scrapy指纹去重原理和scrapy-redis去重原理?

  Scrapy的去重原理流程:使用hash值并设置去重。首先创建一个fingerprint = set() 组合,然后使用sha1对象进行请求对象的信息汇总。汇总完成后,判断hash值是否在集合中。如果是,则返回 true。如果不是,则将其添加到集合中。

  scrapy-redis的去重原理基本相同,只不过是持久化存储在redis共享数据库中。当请求的数据达到10亿以上时,此时会消耗内存。一个sha1会占用40字节 40G内存,大部分存储数据库都负担不起。这时候必须使用布隆过滤器。

  4. 请简单介绍一下scrapy框架。

  scrapy 是一个快速、高级的基于 Python 的网络爬虫框架,用于爬取网站并从页面中提取结构化数据。scrapy 使用 Twisted 异步网络库来处理网络通信。

  5.为什么要使用scrapy框架?scrapy 框架的优点是什么?

  更容易搭建大型爬虫项目

  它异步处理请求并且速度非常快

  它可以使用自动调节机构自动调节爬行速度

  6.scrapy 如何实现分布式爬取?

  可以借助scrapy_redis 类库来实现。

  在分布式爬取中,会有一台主机和一台从机。其中,master为核心服务器,slave为具体爬虫服务器。

  我们在主服务器上搭建了一个redis数据库,将要爬取的URL存放在redis数据库中。所有从爬虫服务器在爬取时都从redis数据库链接。由于scrapy_redis本身的队列机制,slave获取到的URL不会相互冲突,然后爬取的结果最终存储在数据库中。master的redis数据库也会存储爬取到的url的指纹,用于去重。相关代码可以在 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.如何抓取手机数据?

  fiddler,appnium,网络配置

  13.如何抓取全站数据?

  基于手动请求+递归分析发送

  基于CrwalSpider(LinkExtractor,Rule)

  14.如何提高爬取数据的效率?

  使用框架

  线程池,多任务异步协程

  分散式

  15. 列出你接触过的防攀爬机构?

  从功能上来说,爬虫一般分为三部分:数据采集、处理、存储。这里只讨论数据采集部分。

  一般来说,网站从三个方面进行反爬虫:用户请求的Headers、用户行为、网站目录和数据加载方式。前两个比较容易遇到,大多数网站反爬虫都是从这些角度来看的。将采用第三类ajax应用网站,增加爬虫难度。

  1) 通过Headers反爬虫

  从用户请求的Headers反爬取是最常见的反爬取策略。很多网站会检测Headers的User-Agent,还有一些网站会检测Referer(部分资源网站的防泄漏环节就是检测Referer)。如果遇到这种反爬虫机制,可以直接给爬虫添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者修改Referer值为目标网站域名。对于检测header的反爬虫,在爬虫中修改或添加header很容易绕过。

  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脚本。从填表到点击按钮再到滚动页面,一切都可以模拟,无论具体的请求和响应过程,

  使用这个框架几乎可以绕过大部分反爬虫,因为它不是冒充浏览器获取数据(上面是在一定程度上通过添加Headers来冒充浏览器),它是浏览器本身,phantomJS是一个没有界面的浏览器,但它不是控制浏览器的人。使用selenium+phantomJS可以做很多事情,比如识别point-and-touch(12306)或滑动验证码,页面表单的暴力破解等)。它还将在自动化渗透方面展示其才华,并且在未来也会这样做。提这个。

  16.什么是深度优先和广度优先(优缺点)

  默认情况下,scrapy 是深度优先。

  深度优先:占用空间大,运行速度快。

  广度优先:占用空间小,运行速度慢

  17.你知道谷歌的无头浏览器吗?

  无头浏览器是无头浏览器,没有界面的浏览器。既然是浏览器,它应该拥有浏览器应有的一切,但你看不到界面。

  Python中selenium模块中的PhantomJS是无头浏览器(headless browser):它是一个基于QtWebkit的无头浏览器。

  18. 说说Scrapy的优缺点。

  优势:

  scrapy 是异步的

  使用更具可读性的 xpath 而不是常规

  强大的统计和日志系统

  同时抓取不同的 URL

  支持shell模式,方便独立调试

  编写中间件,方便编写一些统一的过滤器

  通过管道存储在数据库中

  缺点:基于python的爬虫框架,扩展性差

  基于twisted框架,运行异常不会杀死反应器,异步框架出错后不会停止其他任务,数据错误难以检测。

  19. 对于需要登录的网页,如何同时限制ip、cookie、session?

  解决受限IP,可以使用代理IP地址池和服务器;如果动态抓取不适用,可以使用反编译的JS文件获取对应的文件,或者切换到其他平台(如手机)查看是否可以获取对应的json文件。

  20. 验证码怎么解决?

  1.输入类型验证码

  解决方法:这是最简单的一种,只要你认清里面的内容,然后在输入框中填写即可。这种识别技术叫做OCR,这里推荐使用第三方Python库tesserocr。对于不受阴影影响的验证码,可以直接通过该库进行识别。但是对于背景嘈杂的验证码,直接识别率会很低。在这种情况下,我们需要先对图片进行处理,先对图片进行灰度化,然后进行二值化,然后再进行Recognition,这样识别率会大大提高。

  验证码识别的大概步骤:

  转换为灰度

  去除背景噪音

  图片分割

  2.刷卡式验证码

  解决方法:这种验证码稍微复杂一点,但是有相应的方法。我们直接想到的就是模拟人拖动验证码,点击按钮,然后看到缝隙的位置,最后将拼图拖到缝隙中完成验证的动作。

  第一步:点击按钮。然后我们发现没有点击按钮的时候缝隙和拼图没有出现,只有点击后才出现,这为我们找到缝隙的位置提供了灵感。

  步骤 2:拖动到间隙位置。我们知道应该把拼图拖到缝隙里,但是这个距离怎么用数值来表示呢?通过我们在第一步观察到的现象,我们可以找到缺口的位置。这里我们可以比较两张图片的像素,设置一个参考值。如果某个位置的差异超过了参考值,那么我们就找到了两张图片的不同位置。当然,我们来自拼图的右侧。从侧面开始,从左到右,当你找到第一个不同的位置时结束。这个位置应该是gap的左边,所以我们可以用selenium拖动到这个位置。这里的另一个问题是如何自动保存这两张图片?在这里我们可以先找到这个标签,然后得到它的位置和大小,然后是顶部,底部,左侧,right = location['y'] ,location['y']+size['height']+location['x'] + size['width'],然后截图,最后把这四个位置填上一个切口。具体使用可以查看selenium文档,点击按钮剪出图片,点击再剪出图片。拖动时,需要模拟人的行为,先加速再减速。因为这种验证码有行为特征检测,一个人不可能做到匀速,否则会被判断为机器拖拽,所以不会通过验证。最后,如果你的时间不是很紧,想快速提高,最重要的是你不怕吃苦。我建议你可以定价@762459510。那真的很好。很多人都在快速进步。你需要害怕困难!可以去加进去看看~

  3.点击式图形验证和图标选择

  图文验证:提醒用户点击图片中的同一个词进行文本验证。

  图标选择:给定一组图片,根据需要单击其中一个或多个。借用识别所有东西来挡机器的难度。

  这两个原理类似,只不过一个是给文字点击图片中的文字,另一个是给图片点击同一张图片。

  这两种方法都不是特别好。他们只能使用第三方识别接口来识别相同的内容。推荐超级鹰,发送验证码,返回对应的点击坐标。然后用selenium模拟点击。获取图片的方法同上面的方法。

  21.滑动验证码怎么破解?

  破解核心思想:

  1、如何确定滑块的滑动距离?

  滑块的滑动距离,需要检测验证码图片的间隙位置

  滑动距离=终点坐标-起点坐标

  那么问题转化为我们需要截图,根据selenium中的position方法,进行一些坐标计算,得到我们需要的位置

  2、我们如何获得坐标?

  起点坐标:

  程序每次运行,位置固定,滑块左边框距离验证码图片左边框6px

  终点坐标:

  每次程序运行时,位置都会发生变化,我们需要计算每个间隙的位置

  如何计算终点,也就是缺口的位置?

  让我给你举个例子。比如下面两张图片都是120x60的图片,一张是纯*敏*感*词*片,一张是带蓝线的图片(蓝线的位置是60px)。我现在让你通过程序确定蓝线的位置,你是怎么确定的?

  回答:

  遍历所有像素的颜色值,找到不同颜色值的点的位置,确定蓝线的位置

  怎么理解这句话?大家点开我下面的图片,有没有发现图片是由一个像素组成的,一张120×60的图片,对应的像素是横轴120像素,纵轴60像素,我们需要遍历坐标两张图片并比较色值,从(0,0)(0,1)... to (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,都必须在存储数据之前进行。必须先建表,根据要捕获的数据结构和内容定义字段。这是一个耐心和精力的问题。最后,如果你的时间不是很紧,想快速提高,最重要的是不要怕吃苦,建议你买这个价格@762459510,真的很好,很多人进步很快,你要不怕吃苦!可以去加进去看看~

  存储到mongodb

  我最喜欢no sql数据库的原因之一是不需要像关系数据库那样定义表结构,因为定义表结构很麻烦。判断字段的类型,varchar类型的数据也需要定义长度,你定义的小一点,过长的数据会被截断。

  Mongodb 以文档的形式存储数据。可以使用pymongo库直接将数据以json格式写入mongodb。即使在同一个集合中,对数据的格式也没有要求,太灵活了。

  刚刚捕获的数据通常需要进行第二次清理才能使用。如果使用关系型数据库存储数据,第一次需要定义表结构。清洗后,恐怕需要定义一个表结构来恢复清洗后的数据。收纳太麻烦。使用 mongodb 消除了重复定义表结构的过程。

  23.如何处理cookie过期?

  这时候需要自动更新cookie。如何自动更新cookies?这里将使用硒。

  步骤1、 使用selenium自动登录获取cookie,并保存到文件中;

  步骤2、 读取cookie,比较cookie的有效期,如果过期,重新执行步骤1;

  步骤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人工客服


线