對於爬蟲被封禁 ! 爬蟲一般來說只要你的ip夠多,是不容易被封的。 一些中小網站要封殺你,他的技術成本也是很高的,因為大多數網站沒有vps,他們用的是虛擬空間或者是sae,bae這樣的paas雲。 其實就算他們不考慮seo搜索優化,用ajax渲染網頁數據,我也可以用webkit瀏覽器組件來搞定ajax之后的數據。
如果某個網站他就是閑的蛋疼,他就是喜歡從log里面,一行行的分析出你的ip,然后統計處頻率高的網站, 那這個時候咋辦? 其實方法很草比,就是用大量的主機,但是大量的主機是有了,你如果沒有那么爬蟲的種子量,那屬於浪費資源… … 其實一個主機,多個ip是可以的。。。
這個時候是有兩種方法可以解決的,第一個是用squid綁定多個ip地址,做正向代理…. 你的程序里面維持一組連接池,就是針對這幾個正向proxy做的連接池。
正向代理和反向代理最大的區別就是,反向代理很多時候域名是固定的,而正向代理是通過一個http的代理端口,隨意訪問,只是在proxy端會修改http協議,去幫你訪問
如果是python,其實單純調用socket bind綁定某個ip就可以了,但是標題的輪訓是個什么概念,就是維持不同的socket bind的對象,然后你就輪吧 ! 跟一些業界做專門做爬蟲的人聊過,他們用的基本都是這樣的技術。
1 import socket 2 import urllib2 3 import re 4 true_socket = socket.socket 5 6 ipbind='xx.xx.xxx.xx' 7 8 def bound_socket(*a, **k): 9 sock = true_socket(*a, **k) 10 sock.bind((ipbind, 0)) 11 return sock 12 13 socket.socket = bound_socket 14 15 response = urllib2.urlopen('http://www.ip.cn') 16 html = response.read() 17 ip=re.search(r'code.(.*?)..code',html) 18 print ip.group(1)
在http://stackoverflow.com/ 上也找到一些個老外給與的解決方法的思路,他是借助於urllib2的HTTPHandler來構造的出口的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)
那么就有一個現成的模塊 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'}]
轉載:https://my.oschina.net/snowrabbit/blog/808647