精华内容
下载资源
问答
  • 爬虫和反爬虫机制
    2020-09-22 11:11:03

    反爬虫机制:

    一。基于数据加密的反爬
    1.通过Css来反爬虫
    原理:源代码数据不为真的数据,需要通过css位移
    2.通过js动态生成数据进行反爬
    思路:解析关键js,获取数据生成流程,模拟生成数据
    3.数据图片化

    二。基于爬虫行为进行反爬虫
    1.请求ip/账号单位时间内总请求数量判断
    原理:正常浏览区请求网站,速度不会太快,同一个ip账号大量请求了对方服务器,有更大的可能性会被识别为爬虫

    思路:对应的通过购买高质量的ip的方式解决问题
    2.每天请求次数设置阈值
    原理:正常的浏览器行为,一天的请求次数有限的
    思路:买高质量ip ,同时设置请求间随机休眠

    3.同一ip/账号请求之间的间隔判断
    原理:正常请求间隔是随机的。而爬虫两个请求之间间隔相对固定同时时间较短
    思路:请求之间随机等待,尽量使用代理池

    4.运维平台综合审计
    运维平台综合管理,采用复合型反爬虫策略,多种手段同时使用

    5.阻塞网络IO
    原理: 发送请求获取响应的过程实际上就是下载的过程,在任务队列中混入一个大文件的url,当爬虫在进行该请求时会占用网络io

    1. 阻塞任务队列
      原理:通过生成大量垃圾url,从而阻塞任务队列,降低爬虫实际工作效率。
      思路:观察运行过程中请求响应状态/仔细分析源码获取垃圾url生成规则,对url过滤

    7.通过假数据反爬
    原理:向返回的响应中添加假数据污染数据库
    思路:长期运行,核对数据库中数据同实际页面中数据对应情况

    8.通过蜜罐获取爬虫ip(代理ip)
    在爬虫获取链接进行请求过程中,爬虫根据正则xpath css 等方式进行后续链接提取,此时服务器端可以设置一个陷阱url,会被提取规则获取,但是正常用户无法获取就能区分爬虫和正常用户。

    9.通过js 实现跳转来反爬虫
    原理:js实现页面跳转,无法在源代码中获取下一页url

    三。基于身份识别
    1.通过headers 中的user-agent 字段反爬虫
    原理:爬虫默认情况下没有user-agent,而是使用默认设置
    思路: 请求前添加user-agent ,最好使用user-agent池活随机生成

    2.通过cookie
    原理:检查cookie来查看发起请求的用户是否具备相应权限
    思路:进行模拟登陆,成功获取cookie后进行数据爬取

    3.referer 字段
    原理:爬虫通常不会待referer字段

    4.通过验证码
    原理:弹出验证码强制验证用户浏览行为
    思路:机器学习识别 打码平台

    5.通过js 生成请求参数
    思路:分析js,观察加密过程的实现,使用selenium

    6。通过从html静态文件中获取请求数据
    原理:通过增加获取请求参数的难度进行反爬

    更多相关内容
  • 主要给大家介绍了一些关于爬虫和反爬虫的简略方案的相关资料,文中介绍的非常详细,对大家理解和学习爬虫与反爬虫具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
  • 基于Python的网络爬虫与反爬虫技术的研究.pdf
  • python学习爬虫相关项目案例,通过案例深度学习爬虫和反爬虫,帮你深度学习爬虫。
  • 什么是爬虫和反爬虫

    千次阅读 2020-02-24 11:53:03
    什么是爬虫和反爬虫? 爬虫:使用任何技术手段,批量获取网站信息的一种方式。 反爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。 常见的反爬虫机制 通过UA 识别爬虫 有些爬虫的UA是特殊...

    什么是爬虫和反爬虫?

    • 爬虫:使用任何技术手段,批量获取网站信息的一种方式。
    • 反爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。

     

    常见的反爬虫机制

    • 通过UA 识别爬虫 有些爬虫的UA是特殊的,与正常浏览器的不一样,可通过识别特征UA,直接封掉爬虫请求
    • 设置IP访问频率,如果超过一定频率,弹出验证码 如果输入正确的验证码,则放行,如果没有输入,则拉入禁止一段时间,如果超过禁爬时间,再次出发验证码,则拉入黑名单。当然根据具体的业务,为不同场景设置不同阈值,比如登陆用户和非登陆用户,请求是否含有refer。
    • 通过并发识别爬虫 有些爬虫的并发是很高的,统计并发最高的IP,加入黑名单(或者直接封掉爬虫IP所在C段)
    • 请求的时间窗口过滤统计 爬虫爬取网页的频率都是比较固定的,不像人去访问网页,中间的间隔时间比较无规则,所以我们可以给每个IP地址建立一个时间窗口,记录IP地址最近12次访问时间,每记录一次就滑动一次窗口,比较最近访问时间和当前时间,如果间隔时间很长判断不是爬虫,清除时间窗口,如果间隔不长,就回溯计算指定时间段的访问频率,如果访问频率超过阀值,就转向验证码页面让用户填写验证码
    • 限制单个ip/api token的访问量 比如15分钟限制访问页面180次,具体标准可参考一些大型网站的公开api,如twitter api,对于抓取用户公开信息的爬虫要格外敏感
    • 识别出合法爬虫 对http头agent进行验证,是否标记为、百度的spider,严格一点的话应该判别来源IP是否为、baidu的爬虫IP,这些IP在网上都可以找到。校验出来IP不在白名单就可以阻止访问内容。
    • 蜜罐资源 爬虫解析离不开正则匹配,适当在页面添加一些正常浏览器浏览访问不到的资源,一旦有ip访问,过滤下头部是不是搜素引擎的蜘蛛,不是就可以直接封了。比如说隐式链接。

     

    破解反爬虫机制的几种方法

    • 策略1设置下载延迟,比如数字设置为5秒,越大越安全
    • 策略2禁止Cookie,某些网站会通过Cookie识别用户身份,禁用后使得服务器无法识别爬虫轨迹
    • 策略3使用user agent池。也就是每次发送的时候随机从池中选择不一样的浏览器头信息,防止暴露爬虫身份
    • 策略4使用IP池,这个需要大量的IP资源,可以通过抓取网上免费公开的IP建成自有的IP代理池。
    • 策略5分布式爬取,这个是针对大型爬虫系统的,实现一个分布式的爬虫,主要为以下几个步骤: 1、基本的http抓取工具,如scrapy; 2、避免重复抓取网页,如Bloom Filter; 3、维护一个所有集群机器能够有效分享的分布式队列; 4、将分布式队列和Scrapy的结合; 5、后续处理,网页析取(如python-goose),存储(如Mongodb)。
    • 策略6:模拟登录—浏览器登录的爬取 设置一个cookie处理对象,它负责将cookie添加到http请求中,并能从http响应中得到cookie,向网站登录页面发送一个请求Request, 包括登录url,POST请求的数据,Http header利用urllib2.urlopen发送请求,接收WEB服务器的Response。

    展开全文
  • 基于Python的网络爬虫与反爬虫技术研究.pdf
  • Python爬虫和反爬虫的斗争

    千次阅读 2019-05-29 16:26:49
    我们常接触的网络爬虫是百度、搜搜、谷歌(Google)等公司的搜索引擎,这 些搜索引擎通过互联网上的入口获取网页,实时存储并更新索引。搜索引擎的基础 就是网络爬虫,这些网...

    640?wx_fmt=jpeg

    我们常接触的网络爬虫是百度、搜搜、谷歌(Google)等公司的搜索引擎,这 些搜索引擎通过互联网上的入口获取网页,实时存储并更新索引。搜索引擎的基础 就是网络爬虫,这些网络爬虫通过自动化的方式进行网页浏览并存储相关的信息。

    近几年,互联网开始朝着移动应用的方向发展。海量的信息从移动端生产并消 费,遗憾的是,搜索引擎通常并不能触及这些信息。例如,抖音等短视频 APP 中的 视频,目前还不能在百度等搜索引擎搜索到;淘宝的商品信息也无法在常规搜索引 擎中搜索到(只能在淘宝的 APP 中搜索到),等等。由于这些信息无法通过网页搜索到,因此搜索引擎不适合解决此类问题。在商务上,厂商之间可以通过合作的方式 对移动应用中的内容进行查询,例如,搜狗就能搜索到微信公众号的信息。在技术 上,可以开发定向爬虫抓取页面信息,再对其中的数据进行处理,例如各种比价网 站收集价格信息的过程等。那么如何爬取呢?今天我们来说说爬虫和反爬虫的斗争。以下内容来自《爬虫实战:从数据到产品》 

    640?wx_fmt=png

    《爬虫实战:从数据到产品》 

    640?wx_fmt=png

    扫码查看详情


    常见的方法

     

    在抓取对方网站、APP 应用的相关数据时,经常会遇到一系列的方法阻止爬虫。一方面是为了保证服务的质量,另一方面是保护数据不被获取。常见的一些反爬虫 和反反爬虫的手段如下。 

    (1)IP 限制 

    IP 限制是很常见的一种反爬虫的方式。服务端在一定时间内统计 IP 地址的访问 次数,当次数、频率达到一定阈值时返回错误码或者拒绝服务。这种方式比较直接 简单,但在 IPv4 资源越来越不足的情况下,很多用户共享一个 IP 出口,典型的如“长 城宽带”等共享型的 ISP。另外手机网络中的 IP 地址也是会经常变化的,如果对这 些 IP 地址进行阻断,则会将大量的正常用户阻止在外。 

    对于大多数不需要登录就可以进行访问的网站,通常也只能使用 IP 地址进行限 制。比如“Freelancer 网站”,大量的公开数据可以被访问,但同一个 IP 地址的访问 是有一定的限制的。针对 IP 地址限制非常有效的方式是,使用大量的“高匿名”代 理资源。这些代理资源可以对源 IP 地址进行隐藏,从而让对方服务器看起来是多个 IP 地址进行访问。另一种限制方式是,根据业务需要,对国内、国外的 IP 地址进行 单独处理,进而对国外的高匿名代理进行阻断,例如使用海外的 IP 地址访问“天眼 查网站”则无法访问。 

    (2)验证码 

    验证码是一种非常常见的反爬虫方式。服务提供方在 IP 地址访问次数达到一定 数量后,可以返回验证码让用户进行验证。这种限制在不需要登录的网页界面比较 常见,它需要结合用户的 cookie 或者生成一个特殊标识对用户进行唯一性判断,以 防止同一个 IP 地址访问频率过高。验证码的存在形式非常多,有简单的数字验证码、 字母数字验证码、字符图形验证码,网站也可以用极验验证码等基于用户行为的验 证码。针对简单验证码,可以使用打码平台进行破解。这种平台通过脚本上传验证 的图片,由打码公司雇用的人工进行识别。针对极验验证等更复杂的验证码,可以尝试模拟用户的行为绕过去,但通常比较烦琐,难度较大。谷歌所用的验证码更为 复杂,通常是用户端结合云端进行手工打码,但会带来整体成本较高的问题。要想绕过这些验证码的限制,一种思路是在出现验证码之前放弃访问,更换 IP 地址。ADSL 拨号代理提供了这种可能性。ADSL 通过拨号的方式上网,需要输入 ADSL 账号和密码,每次拨号就更换一个 IP 地址。不同地域的 IP 地址分布在多个地 址段,如果 IP 地址都能使用,则意味着 IP 地址量级可达千万。如果我们将 ADSL 主机作为代理,每隔一段时间主机拨号一次(换一个 IP),这样可以有效防止 IP 地 址被封禁。这种情况下,IP 地址的有效时限通常很短,通常在 1 分钟以下。结合大 量的 ADSL 拨号代理可以达到并行获取大量数据的可能。如果网站使用了一些特殊 的唯一性的标识,则很容易被对方网站识别到,从而改进反爬虫策略,面对这种情 况,单独切换 IP 地址也会无效。遇到这种情况,必须要搞清楚标识的生成方式,进 而模拟真实用户的访问。 

    (3)登录限制 

    登录限制是一种更加有效的保护数据的方式。网站或者 APP 可以展示一些基础的数据,当需要访问比较重要或者更多的数据时则要求用户必须登录。例如,在天 眼查网站中,如果想要查看更多的信息,则必须用账号登录;“知乎”则是必须在登 录后才能看到更多的信息。登录后,结合用户的唯一标识,可以进行计数,当访问 频度、数量达到一定阈值后即可判断为爬虫行为,从而进行拦截。针对“登录限制” 的方法,可以使用大量的账号进行登录,但成本通常比较高。 

    针对微信小程序,可以使用 wx.login()方法,这种方式不需要用户的介入,因而 不伤害用户的体验。小程序调用后会获取用户的唯一标识,后端可以根据这个唯一 标识进行反爬虫的判断。 

    (4)数据伪装 

    在网页上,我们可以监听流量,然后模拟用户的正常请求。mitmproxy 等工具可 以监听特定网址的访问(通常是 API 的地址),然后将需要的数据存储下来。基于 Chrome Headless 的工具也可以监听到流量并进行解析。在这种情况下,某些网站会 对数据进行一些伪装来增加复杂度。例如,在某网站上展示的价格为 945 元,在 DOM 树中是以 CSS 进行了一些伪装。要想得到正确的数值,必须对 CSS 的规则进行一些 计算才行,某网站上展示的价格如图 1-1 所示。 

    640?wx_fmt=png

    图 1-1  某网站上展示的价格 

    该网站使用特殊的字体对数据进行了伪装。例如,3400,对应显示的是 1400, 如图 1-2 所示。如果能够找到所有的字体对应的关系,则可以逆向出正确的价格。 

    某电影网站使用特殊的字符进行数据隐藏,这种不可见的字符会增加复杂度, 但还是可以通过对应的 UTF-8 字符集找到对应关系,从而得到正确的值,如图 1-3 所示。 

    640?wx_fmt=png

    图 1-2  3400 显示为 1400 

    640?wx_fmt=png

    图 1-3  网站用特殊字符进行伪装 

    对于这种伪装,可以人工分析目标网站的前端代码,对 CSS、JavaScript 和字符进行分析,推导出计算公式。在这种情况下,使用爬虫必须要非常小心,因为很可 能目标网站进行改版后,规则已经发生了变化,抓取到的数据便会无效。在爬虫程序的维护上可以增加一些数据有效性的检查,通过自动化或者人工的方式进行检查。例如,针对机票数据可以检查价格是否在一个合理的区间范围内,如果超出,则认为规则已经变化。更为复杂的方案是可以借助 OCR 技术,对所需要的区域进行识别, 然后对比抓取到的结果。 

    (5)参数签名 

    设计良好的 API 通常都要对参数使用签名(sign)来驱避非法请求,常见于手机 APP。APP 通过加密算法对请求的参数进行运算,从而得到一个签名。这个签名通常 和时间戳相关,并且在请求中附加上时间戳。在请求的参数固定的情况下,能够在一小段时间内生效。当请求发送到服务端后,服务端对参数、时间戳进行验证,比较签名是否一致。如果不一致,则判断为非法请求。这样做的好处是,可以保护请 求,即便是被抓包,在很短时间内这个请求就会失效。获取 APP 端的加密算法一般较为困难,通常需要进行反编译才能获得加密算法。然而现阶段绝大多数 APP 已经 被加壳(典型的如 360 加固、爱加密等),要进行反编译都很困难。另一种保护措施 是,将加密算法放到原生代码中进行编译,通常这些代码是 C 或 C++代码。由于原生代码相对于 Java 代码更难进行逆向工程,所以这给反编译又带来了更多的麻烦。 

    针对这种参数签名的方法,没有太好的途径能够来解决,在逆向反编译无果的 情况下,可以试着找寻有没有其他的入口,例如,HTML5、微信小程序等。如果它 们请求了相同的 API,则很有可能在源代码中包含了加密算法。幸运的是,基于 JavaScript 开发的应用非常容易逆向分析,能够很快地获取加密算法,从而绕过 APP 的保护机制。如果这些方法都不奏效,则可以考虑模拟用户操作应用,通过抓包的方式采集到流量中的信息。但这种方式效率较低,如果要发出多个并发的请求,往往需要多个设备同时进行。 

    (6)隐藏验证 

    更复杂的反爬虫的方式之一是,隐藏验证。例如,在网站的防护上,通过 JavaScript 请求一些特殊的网址,可以得到一些特定的令牌(token),这样每次请求时即可生成

    不同的令牌。甚至有些网站会在不可见的图片加上一些特殊的请求参数,从而识别 是否是真正的浏览器用户。这种情况下,想直接获取 API 进行请求通常行不通或者 非常困难,只能通过 Chrome Headless 等工具模拟用户的行为,从而规避这种情况。

    (7)阻止调试 

    在分析某旅游网站时发现,一旦打开浏览器的控制台界面,就会无限触发浏览器的 debugger 指令。深入研究代码发现,该网站在一个名为 leonid-tq-jq-v3-min.js 中 给所有的构造函数都加上了 debugger 这个关键字,导致任何对象的生成都会触发调试器。这样做的目的是阻止意外的脚本或程序进行跟踪调试,从而保护代码。这种情况下,可以构建一个修改过的 js 文件,去掉 debugger 关键字,使用 mitmproxy 转发流量并拦截 leonid-tq-jq-v3-min.js,将改后的 js 文件返回给浏览器,从而绕过这个限制,某旅游网调试界面如图 1-4 所示。 

    640?wx_fmt=png

    图 1-4  某旅游网调试界面 


    代理服务器 

    代理服务器是爬虫工具的基本武器,既可以隐藏真实的访问来源,又可以绕过 大部分网站都会有的 IP 地址的访问频度的限制。常见的代理有 HTTP 代理和 HTTPS 代理两种,根据匿名程度的不同,可以将代理级别分为以下 5 种。 

    (1)高匿名代理 

    高匿名代理会将数据包原封不动地转发,从服务端来看,就像是真的一个普通客户端在访问,而记录的 IP 地址是代理服务器的 IP 地址,可以对很好地隐藏访问源, 所以这种代理为爬虫工具首选。 

    (2)普通匿名代理 

    普通匿名代理会在数据包上做一些改动,代理服务器通常会加入的 HTTP 头有 HTTP_VIA 和 HTTP_X_FORWARDED_FOR 两种。根据这些 HTTP 头,服务端可以发现这是一个代理服务器,并且可以追踪到客户端的真实 IP 地址。 

    (3)透明代理 

    透明代理不仅改动了数据包,还会告诉服务器客户端的真实 IP 地址,因此在抓 取数据时应该避免使用这种代理服务器。 

    网上有一些免费代理列表网站会定期扫描互联网,从而获取一些代理服务器的信息,然后将这些信息公布出来。这些代理服务器的有效期可能比较短,也容易被滥用,质量通常较差,所以需要客户端自己筛选出可用的代理。 

    在代理的种类上,HTTP 代理多,HTTPS 代理较少。在互联网倡导 HTTPS 的 趋势下,单纯使用 HTTP 代理是无法访问 HTTPS 网址的。大部分往往网站会同时保留 HTTPS 和 HTTP 的访问,所以可以试着将 HTTPS 网址改为 HTTP(协议),一个 原则是,如果网站的 HTTP 可以用,则不要使用 HTTPS。原因是 HTTPS 需要多次握 手,速度比较慢,经过代理之后会显得更慢。HTTP 则会快很多,而且代理服务器可选资源较多,HTTP 代理列表如图 1-5 所示,HTTPS 代理列表如图 1-6 所示。 

    640?wx_fmt=png

    图 1-5  HTTP 代理列表 

    640?wx_fmt=png

    图 1-6  HTTPS 代理列表 

    (4)洋葱代理 

    洋葱代理(The Onion Router,TOR)是用于访问匿名网络的软件,可以防止传 输到互联网上的流量被其他人过滤、嗅探或分析。洋葱代理在国内无法使用,如果 需要抓取国外的网站,可以在海外的服务器上搭建洋葱代理,通过它提供的 Socks5 代理端口进行匿名访问。洋葱代理的 IP 地址可以进行受控的切换,从而得到不同的 出口 IP 地址。但遗憾的是,洋葱代理要经过多层的加密和跳转,延迟时间很长,也不稳定,出口的 IP 地址也并不是随机地在全球出口选择,而是固定在一定的区间内, 因而洋葱代理在多并发、高速的场合下并不适用。 

    (5)付费代理资源 

    如果能够做好代理的质量筛选,那么大部分场景下免费代理资源都是够用的。付费代理资源通常用在需要更为稳定的访问场合或者免费资源不够用的情况下。ADSL 拨号代理可以提供大量的国内 IP 资源,还可以指定省份。ADSL 拨号代理服 务器可以每隔几秒钟就更换IP地址,所以服务器看到的是来自不同的IP地址的访问。由于使用该 IP 地址的时间不长,不大可能被服务器屏蔽,所以通常数据抓取质量比 较稳定,能够持续使用。获得这些代理的方式有以下两种: 

    • 代理列表。服务商会提供一个代理列表访问地址,每次可以提取一定数量 的代理服务器。这些代理服务器通过 ADSL 代理获得,它们通常存活时间 不长,根据服务商的不同,一般存活时间在两三分钟之内。客户端必须不 断地刷新代理服务器列表以取得新的代理列表数据。 

    • 服务提供商会提供一个固定的访问地址和账号,通过访问这个固定的地址, 可以得到不停更换的出口 IP 地址。代理商在服务期内会通过二次代理随机 地将请求分发到不同的代理服务器上。这种方式对于客户端来说访问是透 明的,适用于无法通过编程获得代理服务器列表的应用。 

    另外,ADSL 拨号代理也可以自行搭建,方法是购买具有 ADSL 拨号网络的服务器资源,使用脚本定时拨号,等待一段时间后挂断,从而获得不断变化的 IP 地址。

     

    构建自己的代理池 


    网络上存在着大量的代理列表可以免费获取,虽然有效性通常少于 10%,但基

    于庞大的数量(通常每日可获得上万个),也会有近千个代理可以用。在 GitHub 上 有很多抓取这类代理的项目,但质量良莠不齐,很难满足需要。经过对比后,我选 择了 ProxyBroker 这个项目。 

    ProxyBroker 是一个开源项目,可以从多个源异步查找公共代理并同时检查它们 的有效性。它比较小巧,代码不复杂且易于扩展,不依赖于 Redis 等第三方依赖,非 常专注地做好了抓取代理这件事。 

    特点: 

    • 从大约 50 个来源中找到 7000 多个代理工作。

    • 支持协议:HTTP/HTTPS,Socks4/5;还支持 CONNECT 方法的 80 端口和 23 端口(SMTP)。

    • 代理可以按照匿名级别、响应时间、国家和 DNSBL 中的状态进行过滤。

    •  支持充当代理服务器,将传入的请求分发到外部代理,使用自动代理轮换。

       检查所有代理是否支持 cookie 和 Referer(如需要,还检查 POST 请求)。 自动删除重复的代理。 异步获取。ProxyBroker 支持命令行操作,可以作为一个单独的工具使用。 


    (1)查询可用代理 

    使用下面的命令可查询到前10个美国的高匿名代理,并且支持HTTP和HTTPS。

    
     
    $ proxybroker find --types HTTP HTTPS --lvl High --countries US –strict      -l 10 	
    <Proxy US 0.33s [HTTP: High] 8.9.31.195:8080> 	
    <Proxy US 0.71s [HTTP: High] 104.139.71.46:64663> 	
    <Proxy US 0.81s [HTTP: High] 47.75.64.102:80> 	
    <Proxy US 0.89s [HTTP: High] 50.93.200.237:2018> 	
    <Proxy US 0.93s [HTTP: High] 207.246.69.83:8080> 	
    <Proxy US 0.28s [HTTP: High] 47.75.48.149:80> 	
    <Proxy US 0.28s [HTTP: High] 47.75.39.130:80> 	
    <Proxy US 0.30s [HTTP: High] 47.75.97.82:80> 	
    <Proxy US 0.60s [HTTPS] 205.202.42.230:8083> 	
    <Proxy US 0.40s [HTTP: High] 47.75.126.109:80> 

    (2)抓取列表并输出到文件中 

    使用下面的命令可查询前 10 个美国的高匿名代理到 proxies.txt 文件中,但是不 执行代理种类和连通性的检查。

    
     
    $ proxybroker grab --countries US --limit 10 --outfile ./proxies.txt 	
    $ cat proxies.txt 	
    <Proxy US 0.00s [] 75.128.59.155:80> 	
    <Proxy US 0.00s [] 8.46.64.42:1080> 	
    <Proxy US 0.00s [] 206.71.228.193:8841> 	
    <Proxy US 0.00s [] 69.59.84.76:14471> 	
    <Proxy US 0.00s [] 98.142.237.108:80> 	
    <Proxy US 0.00s [] 104.139.73.239:19330> 	
    <Proxy US 0.00s [] 216.54.3.252:27723> 	
    <Proxy US 0.00s [] 24.227.184.162:1080> 	
    <Proxy US 0.00s [] 8.9.31.195:8080> 	
    <Proxy US 0.00s [] 206.189.85.147:1080> 

    (3)作为代理服务器使用 

    ProxyBroker 可以作为代理服务器使用。在这种模式下可以很方便地进行 IP 地址 的自动切换,对应用程序透明,对于一些既有的应用程序来说,使用代理服务器来 隐藏身份十分方便。 

    用法:在一个终端窗口中启动代理服务器。

    
     
    $ proxybroker serve --host 127.0.0.1 --port 8888 --types HTTP HTTPS –lvl      High 	
    Server started at http://127.0.0.1:8888

    在另一个终端窗口中,使用这个代理地址访问 ifconfig.co,即可得到你的代理服 务器地址,而不是你的 IP 地址。 

    当前网络的 IP 地址: 

    
     
    $ curl ifconfig.co 	
    202.56.38.130

    使用高匿名代理后的 IP 地址: 

    
     
    $ curl -x http://localhost:8888 ifconfig.co 	
    191.103.88.21 

    更多的命令及选项可以通过执行 proxybroker --help 获取。 

    (4)扩展 

    若命令行提供的功能并不符合我们的需求,可以对其核心进行扩展以满足我们 的需求。下面这个例子来自 ProxyBroker 官方代码,目的是显示找到的代理的详细信息:

    
     
    import asyncio 	
    from proxybroker import Broker 	
       	
    async def show(proxies):     	
    while True:         	
    proxy = await proxies.get()         	
    if proxy is None: break         	
    print('Found proxy: %s' % proxy)    	
    	
    proxies = asyncio.Queue() 	
    broker = Broker(proxies) 	
    tasks = asyncio.gather(     	
    broker.find(types=['HTTP', 'HTTPS'], limit=10),     	
    show(proxies))    	
    	
    loop = asyncio.get_event_loop() 	
    loop.run_until_complete(tasks) 	
    $ python3 proxy-broker.py 	
    Found proxy: <Proxy HK 0.24s [HTTP: High] 47.90.87.225:88> 	
    Found proxy: <Proxy HK 0.24s [HTTP: High] 47.52.231.140:8080> 	
    Found proxy: <Proxy HK 0.25s [HTTP: High] 47.89.41.164:80> 	
    Found proxy: <Proxy ID 0.32s [HTTP: Transparent] 222.124.145.94:8080> 	
    Found proxy: <Proxy US 0.40s [HTTP: Transparent] 47.254.22.115:8080> Found proxy: <Proxy US 0.37s [HTTP: High] 40.78.60.44:8080> 	
    Found proxy: <Proxy ID 0.37s [HTTP: High] 103.240.109.171:53281> 	
    Found proxy: <Proxy MX 0.38s [HTTP: High] 201.167.56.18:53281> 	
    Found proxy: <Proxy EC 0.51s [HTTP: High] 190.214.0.154:53281> 	
    Found proxy: <Proxy RU 0.54s [HTTP: High] 46.173.191.51:53281> 

    更多的例子可以参考 ProxyBroker 官方文档。 

    (5)构建自己的代理列表池 

    我们想构造一个代理池,它仅包含一系列不断刷新的高匿名代理,以方便客户端的使用。这个代理池仅仅提供代理服务器的地址,并不需要处理额外的事情,客 户端拿到这些代理服务器地址后,需要对这个列表按照自己的需求进行处理。例如, 对代理进行筛选,对代理服务器的有效性进行评估,对代理服务器进行质量排序, 定时刷新代理列表,等等。 

    某些代理池软件设计得较为复杂,将代理的筛选、评价逻辑放到了代理池内部 进行处理,暴露给客户端的好像是使用一个代理地址,虽然这在一定程度上简化了 客户端的逻辑,但由于各个客户端对代理的使用不尽相同,因此往往限制了客户端 以佳的方式来使用代理列表。 

    当然,简化的代理池也存在一些优点和弊端: 

    • 客户端可能有重复的逻辑,但这种逻辑可以通过代码共享、包共享等方式 消除。

    • 有些客户端无法修改源代码,无法植入代理使用的逻辑。 

    在设计上,通过爬虫的方式获取的代理失效得都比较快,因此我们可以将 ProxyBroker 获取的代理服务器地址源源不断地放到 Redis 缓存中,以提供一个含有大量代理地址的列表。首先,对于每个代理,我们需要设置一天的有效期(或者更短),以便能够自动清除过期的代理。其次,我们需要提供一个简单的 HTTP 代理服务器,以便能够为应用程序提供一个代理服务器列表的访问入口。 

    通过 ProxyBroker 获取代理: 

    
     
    #Proxy-pool-gather.py 	
    import asyncio    	
    import datetime 	
    import logging    	
    from proxybroker 	
    import Broker 	
    import redis	
    	
    r = redis.Redis(host='localhost', encoding="UTF-8", decode_responses=True)    	
    expire_time_s = 60 * 60 * 24    #一天后过期 	
    async def save(proxies):     	
    while True:         	
    proxy = await proxies.get()         	
    if proxy is None:             	
        break         	
    if "HTTP" not in proxy.types:             	
        continue         	
    if "High" == proxy.types["HTTP"]:             	
        print(proxy)             	
        row = '%s://%s:%d' % ("http", proxy.host, proxy.port)             r.set(row, 0, ex=expire_time_s)    	
    	
    while True:     	
        proxies = asyncio.Queue()     	
        broker = Broker(proxies, timeout=2, max_tries=2, grab_timeout=3600)     	
        tasks = asyncio.gather(broker.find(types=['HTTP', 'HTTPS']),save(proxies))     	
        loop = asyncio.get_event_loop()     	
        loop.run_until_complete(tasks) 

    HTTP 服务器展示代理列表: 

    
     
    #Proxy-http-server.py 	
    from flask 	
    import Flask 	
    from flask_restful 	
    import Resource, Api 	
    import redis    a	
    pp = Flask(__name__) api = Api(app)    	
    r = redis.Redis(host='localhost', encoding="UTF-8",  decode_responses=True)    	
    class Proxy(Resource):     	
        def get(self):         	
           return r.keys("*")	
    	
    api.add_resource(Proxy, '/proxy.json')	
    	
    if __name__ == '__main__':     	
    app.run(host="0.0.0.0", port=8000)

    在一个终端中运行python3 proxy-pool-gather.py后可以看到代理已经开始抓取工 作。在另一个终端中运行 python3 proxy-http-server.py,访问 http://localhost:8000/proxy.json 会返回代理列表,如图 1-7 所示。

    640?wx_fmt=png

    图 1-7  代理列表 

    这时就已经建立好一个代理池供爬虫工具使用。 

    (6)增加国内的代理网站 

    ProxyBroker 提供的代理网站,大多数来自国外的代理列表;在国内,有些网站 因被屏蔽而获取不到代理资源。针对这种情况,可以把 ProxyBroker 部署到国外的服 务器上以便于寻找代理资源。 

    增加代理列表网站的解析相对比较容易,在 providers.py 文件中提供了所有的代 理列表网站的解析方法。以快代理为例,增加它的解析非常方便,只需增加一个类, 并且在 PROVIDERS 变量中注册这个类的实例即可: 

    
     
    class Kuaidaili(Provider):     	
    domain = "kuaidaili.com"        	
    async def _pipe(self):         	
    urls = ["http://www.kuaidaili.com/free/inha/%d" % n for n in  range(1, 21)]         	
    urls += ["http://www.kuaidaili.com/free/outha/%d" % n for n in  range(1, 21)]         	
    await self._find_on_pages(urls)    	
    PROVIDERS = [ ......     	
         Kuaidaili(), ] 

    添加了国内的代理后,再将代理服务器部署到国外的服务器上,一般能够获取 大约一万条的代理资源信息。 

    以上内容来自《爬虫实战:从数据到产品》 

    640?wx_fmt=png

    《爬虫实战:从数据到产品》 

    640?wx_fmt=png

    扫码查看详情

    编辑推荐

    本书从多个数据项目实例出发,介绍爬虫、反爬虫的各种案例,使读者了解到数据抓取和分析的完整过程。书中案例的难度由浅入深,以作者原创的代码为主,不借助现成的框架,强调在数据采集过程中的发散思维,总结攻克反爬虫的思维模式,实现以低成本的方式得到想要的数据的愿望。最后,用一个“爱飞狗”的例子,为读者展示如何从0到1地开发一个大数据产品。

    640?wx_fmt=png

    扫码或者点击阅读原文购买

    640?wx_fmt=gif


    码书商店是CSDN专为我们的用户建立的一个商店,这里提供大量的技术书籍,除了书籍我们也提供生活类的相关产品,如耳机、键盘等,或者你们如果有需求也可以联系码书商店的客服或者在公众号下留言你们需要的产品,我们尽量满足大家需求哦。

    作为码书商店的运营人员,诚邀你们进入我们的“CSDN码书福利群”,群里会不定时的给大家赠书书籍、优惠券等,若加入时显示二维码已过期,也可加微信号“xthmily”,会拉你入群哦

    640?wx_fmt=png


    点击“阅读原文”

    展开全文
  • 误伤:反爬虫技术将普通用户识别为爬虫,这种情况多出现在封ip中,例如学校网络、小区网络再或者网络网络都是共享一个公共ip,这个时候如果是封ip就会导致很多正常访问的用户也无法获取到数据。所以相对来说封ip的...

    爬虫与发爬虫的厮杀,一方为了拿到数据,一方为了防止爬虫拿到数据,谁是最后的赢家?

    重新理解爬虫中的一些概念

    爬虫:自动获取网站数据的程序
    反爬虫:使用技术手段防止爬虫程序爬取数据
    误伤:反爬虫技术将普通用户识别为爬虫,这种情况多出现在封ip中,例如学校网络、小区网络再或者网络网络都是共享一个公共ip,这个时候如果是封ip就会导致很多正常访问的用户也无法获取到数据。所以相对来说封ip的策略不是特别好,通常都是禁止某ip一段时间访问。
    成本:反爬虫也是需要人力和机器成本
    拦截:成功拦截爬虫,一般拦截率越高,误伤率也就越高
    

    反爬虫的目的

    初学者写的爬虫:简单粗暴,不管对端服务器的压力,甚至会把网站爬挂掉了

    数据保护:很多的数据对某些公司网站来说是比较重要的不希望被别人爬取

    商业竞争问题:这里举个例子是关于京东和天猫,假如京东内部通过程序爬取天猫所有的商品信息,从而做对应策略这样对天猫来说就造成了非常大的竞争

    爬虫与反爬虫大战
    上有政策下有对策,下面整理了常见的爬虫大战策略

    在这里插入图片描述

    所有的努力都值得期许,每一份梦想都应该灌溉!
    原文地址:http://www.cnblogs.com/zhaof/p/7326260.html

    展开全文
  • 反爬虫策略手段 正所谓魔高一尺道高一丈 robots协议 反爬虫策略 反反爬虫策略
  • python爬虫与反爬虫

    2021-09-11 19:50:28
    一、爬虫与反爬虫 1. 爬虫:使用任何技术手段,批量获取网站信息的一种方式。关键在于批量。 2. 反爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。关键也在于批 量。 3. 误伤:在反爬虫的...
  • 爬虫与发爬虫的厮杀,一方为了拿到数据,一方为了防止爬虫拿到... 成本:反爬虫也是需要人力机器成本 拦截:成功拦截爬虫,一般拦截率越高,误伤率也就越高 反爬虫的目的 初学者写的爬虫:简单粗暴,不管对端服
  • 因此,爬虫成了小公司的命脉,反爬虫成了大公司的命脉。OTA是爬虫的一大战场,希望从这里能让大家看出,这个不阳光的行业,现状是怎样的。 实录提要: 如何分析爬虫请求正常用户? 爬虫在识别的时候怎么识别是否...
  • 谈谈对爬虫和反爬的理解 A.爬虫 爬虫的定义: 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。从功能上来讲,...
  • 爬虫和反爬虫 爬虫工程师的手段 从渲染好的 html 页面直接找到感兴趣的节点,然后获取对应的文本 去分析对应的接口数据,更加方便、精确地获取数据 反爬虫: 基于用户行为 检测cookie,封ip 动态网页 某一时间内请求...
  • 搜索引擎是善意的爬虫,它爬取网站的所有页面,提供给其他用户进行快速搜索访问,给网站带来流量。为此,行业还达成了 Robots 君子协议,让互联网上的搜索与被搜索和谐相处。 原本双赢的局面,很快就被一...
  • Python爬虫、反爬虫和反反爬虫

    千次阅读 多人点赞 2018-05-03 20:02:31
    我主要对反爬虫和反反爬虫做一个简单的总结我想补充一下关于爬虫和反爬虫,以及为什么要爬虫,为什么要反爬虫,也就是从技术和技术带来的影响的角度来看待爬虫。发现一个很有意思的链接,爬虫、反爬虫、反反爬虫 1 ...
  • 本人多年使用的爬虫与反爬虫经验 原理+中间件+源代码 各种爬虫技术+针对各种爬虫而开发的反爬虫技术
  • 网站做了很多反爬虫工作,爬起来有些艰难,本文详细介绍了python解决网站的反爬虫策略,有需要的小伙伴可以参考下。
  • 本文针对目前各种爬虫框架, 包括scrapy, requests, selenium 等, 整理总结了一些针对其特征进行反爬虫的方法 。 一、反爬虫是什么? 在这个内容为王的时代, 窃取内容, 成了很多商业模式的致富之道, 为了更...
  • 反爬虫与反反爬虫

    2021-11-24 12:00:05
    1.反爬虫技术 首先我们来思考一下,为什么要反爬虫? 网络中充斥大量爬虫的情况下,会使得整个网络的数据不可靠。 网站在面对高并发爬虫的攻击时,很容易被击溃。 版权数据被爬取,对于网站来说是巨大的损失。 基于...
  • 爬虫的朋友,也许或多或少都遇见过以下问题: 昨天晚上,一个朋友突然给我发上上面的截图,并询问: 1.1引出问题1 为什么解码不行? 在此引入一篇文章《字符串编码》 浏览网页的时候,服务器会把动态生成的...
  • 爬虫和反爬虫日益成为每家公司的标配系统。爬虫在情报获取、虚假流量、动态定价、恶意攻击、薅羊毛等方面都能起到很关键的作用,所以每家公司都或多或少的需要开发一些爬虫程序,业界在这方面的成熟的方案也非常多;...
  • 爬虫,反爬虫和反反爬虫

    千次阅读 2018-11-02 16:22:01
    随之大数据的火热,网络上各种网页抓取/爬虫工具蜂拥而来,因而,网页数据成了大家竞争掠夺的资源,但网站运营者却要开始保护自己的数据资源,以避免被竞争对手获取到... 一、什么是爬虫和反爬虫 一张图说明一切:...
  • 淘宝、京东反反爬虫爬取手机信息 应对反爬的方式:使用 selenium 模拟浏览器方式爬取,先通过以某个端口打 开 chrome 浏览器,手动登录淘宝,防止留下 selenium 指纹被淘宝封号: 再通过 9399 端口将浏览器控制...
  • Python爬爬虫虫与与反反爬爬虫虫大大战战 这篇文章主要介绍了Python爬虫与反爬虫的相关资料文中讲解非常细致帮助大家更好的理解Python爬虫与反 爬虫的关系感兴趣的 友可以了解下 爬虫与发爬虫的厮杀一方为了拿到数据...
  • 爬虫原理及反爬虫机制以及反爬虫方法的应对策略

    千次阅读 多人点赞 2019-04-27 23:00:04
    爬虫原理及反爬虫机制关于爬虫爬虫原理反爬虫机制1.检验数据头User-Agent反爬虫机制解析:2.访问频率限制或检验3.蜜罐技术反爬虫机制的应对方法1.设定Request Headers中的User-Agent2.设定随机访问频率3.代理IP或者...
  • 我记得我第一份实习工作,就是做的爬虫,利用爬虫技术,去爬取各种论坛网站,然后要做到记录到每个论坛帖子的发帖时间,在论坛的板块,页数,发帖时间,发帖 ID ,然后存储起来,可以做到搜索关键字快速定位到哪个...
  • python 反爬虫

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,346
精华内容 15,338
关键字:

爬虫和反爬虫

友情链接: zydnbbs16.zip