1. 程式人生 > >Tor網絡突破IP封鎖,爬蟲好搭檔【入門手冊】

Tor網絡突破IP封鎖,爬蟲好搭檔【入門手冊】

har 兩個 pytho -c 之一 entity 完成後 log 能力

本文地址: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)

技術分享圖片
 1 import urllib2
 2 from TorCtl import TorCtl
 3 
 4 proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"})
 5 opener = urllib2.build_opener(proxy_support) 
 6 
 7 def newId():
 8     conn = TorCtl.connect(controlAddr="127.0.0.1", controlPort=9051, passphrase="your_password")
 9     conn.send_signal("NEWNYM")
10 
11 for i in range(0, 10):
12     print "case "+str(i+1)
13     newId()
14     proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"})
15     urllib2.install_opener(opener)
16     print(urllib2.urlopen("http://www.ifconfig.me/ip").read())
技術分享圖片

Tor網絡突破IP封鎖,爬蟲好搭檔【入門手冊】