国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 常見問題 > 正文

Python爬蟲使用動態(tài)切換ip防止封殺 關(guān)于使用動態(tài)輪訓(xùn)切換ip防止爬蟲被封殺

2019-12-18 01:04:31
字體:
供稿:網(wǎng)友

Python爬蟲使用動態(tài)切換ip防止封殺 關(guān)于使用動態(tài)輪訓(xùn)切換ip防止爬蟲被封殺 這篇文章主要介紹了Python 爬蟲使用動態(tài)切換ip防止封殺的相關(guān)資料,需要的朋友可以參考下


  上次有說過,我在新公司有部分工作是負(fù)責(zé)爬蟲業(yè)務(wù)的,爬蟲機(jī)器有上百臺,節(jié)點也要計劃遷入了Docker平臺上。  這兩天遇到一個棘手的問題,就是因為我們?yōu)榱俗非髷?shù)據(jù)量,在某些機(jī)房,用docker啟動了不少爬蟲節(jié)點,導(dǎo)致一些傻逼網(wǎng)站,開始封禁我們… …   (干死他們,哥們要是有資源,必須干掉ddos,讓你防 !  當(dāng)然我也就裝裝逼,沒這個資源)


  對于爬蟲被封禁 ! 爬蟲一般來說只要你的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)站, 那這個時候咋辦?   其實方法很草比,就是用大量的主機(jī),但是大量的主機(jī)是有了,你如果沒有那么爬蟲的種子量,那屬于浪費資源… …  其實一個主機(jī),多個ip是可以的……


  這個時候是有兩種方法可以解決的,第一個是用squid綁定多個ip地址,做正向代理… 你的程序里面維持一組連接池,就是針對這幾個正向proxy做的連接池。


  正向代理和反向代理最大的區(qū)別就是,反向代理很多時候域名是固定的,而正向代理是通過一個http的代理端口,隨意訪問,只是在proxy端會修改http協(xié)議,去幫你訪問


  如果是python,其實單純調(diào)用socket bind綁定某個ip就可以了,但是標(biāo)題的輪訓(xùn)是個什么概念,就是維持不同的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'}]


  感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 丹寨县| 清丰县| 江城| 三都| 历史| 金溪县| 牡丹江市| 平凉市| 高安市| 宜丰县| 寿光市| 永丰县| 洛宁县| 义马市| 郁南县| 博爱县| 日土县| 甘洛县| 秭归县| 左云县| 美姑县| 陵水| 寿宁县| 全椒县| 临洮县| 堆龙德庆县| 潍坊市| 长泰县| 霸州市| 奉贤区| 富川| 三亚市| 蓬安县| 甘泉县| 阳春市| 延寿县| 沿河| 蓝田县| 绵阳市| 渭南市| 自治县|