Python 爬蟲使用動態(tài)切換ip防止封殺

上次有說過,我在新公司有部分工作是負責爬蟲業(yè)務的,爬蟲機器有上百臺,節(jié)點也要計劃遷入了Docker平臺上。 這兩天遇到一個棘手的問題,就是因為我們?yōu)榱俗非髷?shù)據(jù)量,在某些機房,用docker啟動了不少爬蟲節(jié)點,導致一些傻逼網(wǎng)站,開始封禁我們…. … (干死他們,哥們要是有資源,必須干掉ddos,讓你防 ! 當然我也就裝裝逼,沒這個資源)
對于爬蟲被封禁 ! 爬蟲一般來說只要你的ip夠多,是不容易被封的。 一些中小網(wǎng)站要封殺你,他的技術(shù)成本也是很高的,因為大多數(shù)網(wǎng)站沒有vps,他們用的是虛擬空間或者是sae,bae這樣的paas云。 其實就算他們不考慮seo搜索優(yōu)化,用ajax渲染網(wǎng)頁數(shù)據(jù),我也可以用webkit瀏覽器組件來搞定ajax之后的數(shù)據(jù)。
如果某個網(wǎng)站他就是閑的蛋疼,他就是喜歡從log里面,一行行的分析出你的ip,然后統(tǒng)計處頻率高的網(wǎng)站, 那這個時候咋辦? 其實方法很草比,就是用大量的主機,但是大量的主機是有了,你如果沒有那么爬蟲的種子量,那屬于浪費資源… … 其實一個主機,多個ip是可以的。。。
這個時候是有兩種方法可以解決的,第一個是用squid綁定多個ip地址,做正向代理…. 你的程序里面維持一組連接池,就是針對這幾個正向proxy做的連接池。
正向代理和反向代理最大的區(qū)別就是,反向代理很多時候域名是固定的,而正向代理是通過一個http的代理端口,隨意訪問,只是在proxy端會修改http協(xié)議,去幫你訪問
如果是python,其實單純調(diào)用socket bind綁定某個ip就可以了,但是標題的輪訓是個什么概念,就是維持不同的socket bind的對象,然后你就輪吧 ! 跟一些業(yè)界做專門做爬蟲的人聊過,他們用的基本都是這樣的技術(shù)。
# -*- coding=utf-8 -*-
import socket
import urllib2
import re
true_socket = socket.socket
ipbind='xx.xx.xxx.xx'
def bound_socket(*a, **k):
sock = true_socket(*a, **k)
sock.bind((ipbind, 0))
return sock
socket.socket = bound_socket
response = urllib2.urlopen('http://www.ip.cn')
html = response.read()
ip=re.search(r'code.(.*?)..code',html)
print ip.group(1)
在http://stackoverflow.com/ 上也找到一些個老外給與的解決方法的思路,他是借助于urllib2的HTTPHandler來構(gòu)造的出口的ip地址。
import functools
import httplib
import urllib2
class BoundHTTPHandler(urllib2.HTTPHandler):
def __init__(self, source_address=None, debuglevel=0):
urllib2.HTTPHandler.__init__(self, debuglevel)
self.http_class = functools.partial(httplib.HTTPConnection,
source_address=source_address)
def http_open(self, req):
return self.do_open(self.http_class, req)
handler = BoundHTTPHandler(source_address=("192.168.1.10", 0))
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
import functools
import httplib
import urllib2
class BoundHTTPHandler(urllib2.HTTPHandler):
def __init__(self, source_address=None, debuglevel=0):
urllib2.HTTPHandler.__init__(self, debuglevel)
self.http_class = functools.partial(httplib.HTTPConnection,
source_address=source_address)
def http_open(self, req):
return self.do_open(self.http_class, req)
handler = BoundHTTPHandler(source_address=("192.168.1.10", 0))
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
那么就有一個現(xiàn)成的模塊 netifaces ,其實netifaces模塊,就是剛才上面socket綁定ip的功能封裝罷了
地址: https://github.com/raphdg/netifaces
import netifaces
netifaces.interfaces()
netifaces.ifaddresses('lo0')
netifaces.AF_LINK
addrs = netifaces.ifaddresses('lo0')
addrs[netifaces.AF_INET]
[{'peer': '127.0.0.1', 'netmask': '255.0.0.0', 'addr': '127.0.0.1'}]
import netifaces
netifaces.interfaces()
netifaces.ifaddresses('lo0')
netifaces.AF_LINK
addrs = netifaces.ifaddresses('lo0')
addrs[netifaces.AF_INET]
[{'peer': '127.0.0.1', 'netmask': '255.0.0.0', 'addr': '127.0.0.1'}]
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
- Notepad++怎么配置python?Notepad++中只能寫代碼,卻不能運行代碼,但是如果配置了python就可以直接運行代碼了,很方便,下面我們就來看看Notepad++配置python的教程,需2016-09-22
- Python在Linux、windows、Mac os等操作系統(tǒng)下都有相應的版本,不管在什么操作系統(tǒng)下,它都能夠正常工作。除非使用平臺相關(guān)功能,或特定平臺的程序庫,否則可以跨平臺使用。2016-09-22
selenium+python建立環(huán)境和錄制腳本 中文WORD版
本文檔主要講述的是selenium+python建立環(huán)境和錄制腳本;感興趣的朋友可以過來看看2016-09-22Python+selenium自動化測試入門 (孔祥祝) 中文PPT版
Selenium是一款基于web應用程序的開源測試工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。它支持Firefox、ie、Mozilla等眾多瀏覽器。它同時直至JAVA、C2016-09-22使用Python進行Selenium自動化測試 中文WORD版
Selenium RC支持多種編程語言驅(qū)動客戶端瀏覽器,這里主要介紹使用Python在Windows下驅(qū)動Selenium RC。Python是一種面向?qū)ο蟮慕忉屝缘挠嬎銠C程序設計語言。感興趣的朋友可以2016-09-22Python圖表繪制:matplotlib繪圖庫入門 中文PDF版
matplotlib是python最著名的繪圖庫,它提供了一整套和matlab相似的命令API,十分適合交互式地行制圖。而且也可以方便地將它作為繪圖控件,嵌入GUI應用程序中2016-09-13- Matplotlib.pyplot是用來畫圖的方法,類似于matlab中plot命令,用法基本相同。本文檔主要講述的是python matplotlib畫圖;感興趣的朋友可以過來看看2016-09-13
使用Python分析社交網(wǎng)絡數(shù)據(jù) 中文PDF版 2.88MB
Python是一種廣泛使用的高級編程語言, 具有可讀性強、 編寫容易、 類庫豐富等特。 作為一種“膠水語言”,它可以將使用其他語言編寫的各種模塊(尤其是C/C++) 輕松地聯(lián)結(jié)2016-09-13python網(wǎng)絡爬蟲(抓取網(wǎng)頁的含義和URL基本構(gòu)成) 中文PDF版 4.25MB
爬蟲最主要的處理對象就是URL,他根據(jù)URL地址取得所需要的文件內(nèi)容,然后對它進行一步的處理。因此,準確的理解URL對理解網(wǎng)絡爬蟲至關(guān)重要。感興趣的朋友可以過來看看2016-09-13Python數(shù)據(jù)分析基礎(chǔ)教程:NumPy學習指南(第2版) 中文pdf版[5MB]
本書是NumPy的入門教程,主要介紹NumPy以及相關(guān)的Python科學計算庫,涵蓋NumPy安裝、數(shù)組對象、常用函數(shù)、矩陣運算、線性代數(shù)、金融函數(shù)、窗函數(shù)、質(zhì)量控制、Matplotlib繪2016-07-21