本文地址:http://www.cnblogs.com/likeli/p/5719230.html

前言

  本文不提供任何搭梯子之类的内容,我在这里仅仅讨论网络爬虫遇到的IP封杀,然后使用Tor如何对抗这种封杀。作为一种技术上的研究讨论。

场景

  我们编写的网络爬虫全网采集的时候总会有一些网站有意识的保护自己的网站内容,以防止网络爬虫的抓取。常见的方式就是通过身份验证的方式来进行人机识别。也就是在登陆(查询)的入口增加或者加固防御。这些防御有那些呢?我目前见到的有:各种验证码、参数的加密、在前端JS挖坑、访问频率限制(IP黑名单)等。

  其实前面的几种我们在某些情况下都是有办法解决的,我一一举例:

  1、加密参数。其实老司机们都知道了,在客户端加密参数并没有什么卵用。因为爬虫完全可以将前端的js丢到一个游览器的内核环境中去执行js,这样的话,无论你怎么加密,都没有用,因为这和在游览器中运行没有什么区别,是无法进行人机识别的。

  2、前端在Js脚本中挖坑。这是一些小聪明了,毕竟被抓取的网站方是这场战争的游戏规则制定者,他们能够自己制定规则,然后在没有什么漏洞的情况下,爬虫只能按照对方指定的规则一条条的来,一个坎一个坎的去跨。

  这种情况下,网站开发人员在一大堆的js中藏着一小段预警js作为地雷。毕竟一般情况下,爬虫都是直接请求后得到的响应是一段html的文本,并不会执行其中的js。那么这样就区分出来了,网站方可以在页面加载后执行一段js,这段js不用和服务器通信,就是默默的执行。若是这段js执行了,说明访问者很可能是人,若是没有执行,那么这个访问真绝对是爬虫了。我们在正文请求中附带上的cookie中加上一个特定的标记。告诉服务器这个请求不是人发起的。服务器得到这个消息后,针对IP标记,但是这次请求是允许通过的(隐藏我们的判断依据)。下次或者这个IP访问几次后,就将这个IP拉入黑名单。

   3、验证码,这东西是主要防御手段,这里不多说,我博客里面也有一篇关于这个文章。但是,只要技术能力足够,验证码还是会被突破的。君不见,12306验证码防御也没什么用。

  4、IP黑名单,这个是依赖于上面的一个后台防御策略。但是再某种情况下,这种策略确实很有效,而且无解。

  比如:有一个查询类的网站,通过限制IP的访问次数、频率就完全可以封锁或者限制爬虫,因为爬虫的意义就是自动化的、高效的得到数据。

IP黑名单突破的方案

针对于采用黑名单的网站,我们可以使用的策略就是代理了,我们用各种方式弄到一大批的代理IP,然后通过使用这些代理IP去发起请求,IP被封锁了,就换下一个。

  我们的主题,Tor网络也就用在这里了。

  首先来科普一下:

关于Tor网络

官网:https://www.torproject.org/

Tor是什么

  Tor是互联网上用于保护您隐私最有力的工具之一,但是时至今日仍有许多人往往认为Tor是一个终端加密工具。事实上,Tor是用来匿名浏览网页和邮件发送(并非是邮件内容加密)的。今天,我们要讨论一下Tor的是如何工作的、它做什么、不会做什么,以及我们该如何正确地使用它。

Tor的工作原理是这样的

当你通过Tor发送邮件时, tor会使用一种称为“洋葱路由”的加密技术通过网络随机生成的过程传送邮件。这有点像在一叠信中放了一封密信。网络中的每个节点都会解密消息(打开的最外信封),然后发送内部加密的内容(内密封的信封)至其下一个地址。这导致如果单看一个节点是看不了信的全部内容,并且该消息的传送路径难以追踪。

在Windows上使用Tor

  windows上安装tor很简单,去Tor的官网下载安装洋葱游览器就可以了。

当然,我们可以只安装Tor核心,不安装任何其他附属,然后我们去找个Tor控制器,去操作Tor就可以了。

我这里有两个版本Tor控制器,Windows的Vidalia和OS X版本的Arm(Anonymizing Relay Monitor)这东西就Python开发的,可以完成Vidalia的绝大部分功能。

windows上的Vidalia:

Mac上的Arm:

  目前我使用的也就是在Mac上操作的Arm。我也是重点说Arm的。因为Window下的Tor通过C#或者Python控制都不行,不得已的情况下,换到了OS X/Linux的环境下来控制Tor。

安装Tor、Arm

  首先我们得下载安装了,好消息是,Arm和Tor大部分的包管理器都有,我们可以直接下载。通过包管理器下载后,会自动安装,并完成初始化配置。

  例如我在Mac上的安装以及配置:

brew install tor
brew install arm

我们另外需要安装Privoxy,需要通过Privoxy来将Socks5转换成Http。

brew install Privoxy

最后,我们还需要一个前置代理,因为Tor网络,在国内是不能访问的。所以我们需要一个在国外的前置代理,目前我自己已经搭建好了一个位于加拿大的VPN,这里可以直接用的。

配置Tor、Arm

  我们需要做一些配置,我先给一张我的配置图:

这是从已经配置好的Arm看到的。如上图,绿色的字体就是我给torrc配置文件增加的内容。

我们修改配置就是在 /Users/ Likeli/.arm/torrc 路径(Mac下的路径)。完成以上修改。

关于重要参数的说明:

参数 说明
ControlPort 控制程序访问的端口(重要)
Socks5Proxy 前置代理端口
SocksProt 外部程序访问Tor的端口
MaxCircuitDirtiness 自动切换Identity的时间间隔

除了这些参数,其实还有很多的备选参数,详细说明请查看tor帮助文档,以上配置也是我从tor的官方帮助文档中找到的。

man tor

好了,配置完成了,现在去出去启动Arm,完成初始化。

在终端运行Arm,我直接用Mac 的截图工具,貌似不能构绘制圆圈勾选,这里提供几张别出弄来的图,按照选择就ok了。

Arm配置源地址:https://program-think.blogspot.com/2015/03/Tor-Arm.html?utm_source=tuicool&utm_medium=referral

配置好了,然后启动,启动成功后如下图:

下方的启动日志显示,启动进度100%。

好了,到这一步,其实代理已经通了,来测一测。

  好了,搞定了,目前Tor的Socks5代理已经接通,我们直接连接127.0.0.1:9000就可以了。这里的端口是自己根据上面的配置来的。

收尾

  虽然代理通了,但是还有问题,因为一般我们都是用的Http的代理。所以我们需要将Socks5代理转换成Http代理来方便我们的应用程序使用。

  这里用到的工具是:Privoxy(上面的步骤中,已经通过软件库安装了)

  我们需要对这个做一下一点点配置修改。

我们安装Privoxy后,打开它的配置文件:

打开后,搜索 127.0.0.1:9050

找到下图中的为之后,另起一行,插入 forward-socks5 / 127.0.0.1:9000  .

配置完成后保存关闭,若是我们尝试连接本地的8118端口,也就是 127.0.0.1:8118

若是连接不上,重启一下服务,或者重启电脑。

这里的8118端口也是可以修改的,若是修改,请直接在Privoxy的配置文件中搜索127.0.0.1:8118,并修改8118端口就可以了。

到这里我们就完成了所有的配置了,任何程序直接访问127.0.0.1:8118,并将至设置为代理,就可以躲避网站的IP限制了。

最后

  以上中测试代理可以在Chrome中安装SwitchySharp插件,然后稍加配置就可以了。

  好了,自由享受无限IP的刺激把,如此以后,IP黑名单(IP封锁)形同虚设~

  最后附上Python控制Tor切换IP的样例代码:来源(https://stackoverflow.com/questions/9887505/how-to-change-tor-identity-in-python

 import urllib2
 from TorCtl import TorCtl

 proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"})
 opener = urllib2.build_opener(proxy_support) 

 def newId():
     conn = TorCtl.connect(controlAddr="127.0.0.1", controlPort=9051, passphrase="your_password")
     conn.send_signal("NEWNYM")

 for i in range(0, 10):
     print "case "+str(i+1)
     newId()
     proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"})
     urllib2.install_opener(opener)
     print(urllib2.urlopen("http://www.ifconfig.me/ip").read())

Tor网络突破IP封锁,爬虫好搭档【入门手册】的更多相关文章

  1. 破解网络投票IP限制、验证码限制、COokie限制、Seesion限制的方法!(转)

    顾名思义,网络投票就是在网络上进行的投票活动,但和其他类型的投票不同的是:网络投票是建立在网络投票系统上的,而结果完全由程序输出,无需人工参与.这既是网络投票系统的优点也是其缺点,没有了人工的参与,其 ...

  2. 突破IP限制动态替换代理ip。

    须要导入的两个jar包 实现的javabean <span style="font-size:18px;">package com.jx.po; public clas ...

  3. 封ip对爬虫的影响

    今天要聊的是封ip对爬虫的影响.我认为封ip能拒绝一部分网络请求,减轻服务器的压力,但是如果要是建立一个好的ip池,封对爬虫的影响不大. 爬取国内一个拍卖公司的网站,刚开始用多进程下载,每分钟能爬取 ...

  4. Tor网络介绍

    Tor网络介绍 1.Tor的全称是“The Onion Router”,“An anonymous Internet communicaton system:通过Tor访问一个地址时,所经过的节点在T ...

  5. 【小型系统】简单的刷票系统(突破IP限制进行投票)

    一.前言 相信大家平时肯定会收到朋友发来的链接,打开一看,哦,需要投票.投完票后弹出一个页面(恭喜您,您已经投票成功),再次点击的时候发现,啊哈,您的IP(***.***.***.***)已经投过票了 ...

  6. 伪造http的ip地址,突破ip限制的投票程序

    某WEB投票程序, 使用 ip 限制和cookie限制技术,来限制每个ip每天只能投一次票,使用的是php开发,获取访问者的 ip 使用了搜狐的接口: http://txt.go.sohu.com/i ...

  7. 网络之Ip地址

    0.0.0.0---255.255.255.255 Ip地址分类(D.E)不对外开放 网络类别 最大网络数 IP地址范围(,唯一的,花钱的) 最大主机数 私有IP地址范围 (做内网ip,不可直接访问公 ...

  8. 查找“CDN、负载均衡、反向代理”等大型网络真实IP地址的方法

    首先,CDN.负载均衡.反向代理还分为很多层,有时查出来的是最外层的 CDN 服务器群,真实的机器是不对外开放的,类似这样的: 用户 → CDN 网络 → 一台或多台真实机器 ↗ CDN Server ...

  9. (转)【重磅】无监督学习生成式对抗网络突破,OpenAI 5大项目落地

    [重磅]无监督学习生成式对抗网络突破,OpenAI 5大项目落地 [新智元导读]"生成对抗网络是切片面包发明以来最令人激动的事情!"LeCun前不久在Quroa答问时毫不加掩饰对生 ...

随机推荐

  1. js 刷新页面window.location.reload();

    Javascript刷新页面的几种方法:1    history.go(0)2    window.location.reload() window.location.reload(true) 3   ...

  2. js作用域

    一.js没有块级作用域 在c,java等语言中花括号里的代码都有自己的作用域,而js花括号没有块级作用域,经常会导致一些困惑,不明所以.例如: console.info(color); if(true ...

  3. EBS 中经常用到的一些值集

    名称                                 值集                                                                ...

  4. mysql_config 问题

    1 .you should have mysql_config available in $PATH For CentOS: yum install mysql-devel For openSUSE: ...

  5. 我理解的Sitecore开发流程

    Sitecore是一个强大的支持快速开发CMS建站的平台,进入sitecore后台可以看到 它主要有3个元素: 1.Templates模板 Data template:类似于面向对象编程中的类或结构体 ...

  6. python2.7 学习笔记--列表的使用

    同其它编程语言一样,python也提供了丰富的数据结构,以方便数据的处理.本文介绍两种最基本的数据集合,列表和元组的使用. 一.列表使用介绍 可以理解为一个有序的序列.其使用方式举例如下: list= ...

  7. Android Studio Error:CreateProcess error=216

    Error:CreateProcess error=216, This version of %1 is not compatible with the version of Windows you' ...

  8. JS获取元素CSS值

    一.getComputedStyle getComputedStyle 是一个可以获取当前元素所有最终使用的CSS属性值.返回的是一个CSS样式声明对象([object CSSStyleDeclara ...

  9. JDBC之存储过程

    存储过程的语法创建就不说了,这里这篇博客 就挺详细了http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html. 1. Java代码调用没有参数的存错过程 ...

  10. 第五篇 基于.net搭建热插拔式web框架(拦截器---请求管道)

    好了,前边我们把核心内容介绍完了,接下来要做的就是拦截用户的请求,并把请求转向沙箱内. 这里我们准备通过实现一个HttpModule类来完成请求的拦截与转发.新建一个HuberHttpModule类, ...