我上次说过,我在新公司的部分工作是负责爬虫业务。爬虫机器有几百台,节点要计划移入Docker平台。在过去的两次ddos中,我们遇到了一个棘手的问题,因为我们为了追求数据量,在一些机房用docker启动了很多爬虫节点,导致一些傻逼网站开始封杀我们.................当然我只是装的,我没有资源)
禁止爬行动物!一般来说,只要你有足够的ip,爬虫就不容易被屏蔽。一些中小网站想屏蔽你,他的技术成本也很高,因为大部分网站没有vps,用的是虚拟空间或者sae、bae之类的paas云。其实就算他们不考虑seo搜索优化,用ajax渲染web数据,我也可以用webkit浏览器组件来处理ajax之后的数据。
如果一个网站只是一个讨厌鬼,他只是喜欢从日志中一行一行的分析你的ip,然后统计高频的网站。这时候我们该怎么办?其实方法比grass好很多,就是使用大量主机,但是大量主机可用。如果你没有爬虫种子的量,那就是浪费资源.事实上,一台主机有多个ip是可以的。
这个时候有两种方法可以解决这个问题。第一种是用squid绑定多个ip地址,并充当转发代理.您的程序维护一组连接池,它们是这些转发代理的连接池。
正向代理和反向代理最大的区别在于,反向代理的域名往往是固定的,而正向代理是通过一个http代理端口随意访问的,但是在代理端会修改http协议来帮你访问。
如果是python的话,其实简单的调用socket bind绑定某个ip就可以了,但是什么叫片头的轮训概念,就是维护不同的socket bind对象,然后就可以轮到你了!我和业内一些专门做爬虫的人聊过,他们基本都在用这个技术。
# -*-编码=utf-8 -*-
导入插座
导入urllib2
进口re
true_socket=socket .套接字
ipbind='xx.xx.xxx.xx '
def bound_socket(*a,**k):
sock=true_socket(*a,**k)
sock.bind((ipbind,0))
回力袜
socket.socket=bound_socket
response=urllib2.urlopen(' ')
html=response.read()
ip=re.search(r'code。(.*?).代码',html)
打印ip.group(1)
在网上也找到了一些外国人的解决方法。他在urllib2的HTTPHandler的帮助下构造了出口的ip地址。
导入功能工具
导入httplib
导入urllib2
类BoundHTTPHandler(urllib2。HTTPHandler):
def __init__(self,source_address=None,debuglevel=0):
URL lib 2 . httphandler . _ _ init _ _(self,debuglevel)
self . http _ class=func tools . partial(http lib。HTTPConnection,
源地址=源地址)
def http_open(self,req):
返回self.do_open(self.http_class,req)
handler=BoundHTTPHandler(source _ address=(' 192 . 168 . 1 . 10 ',0))
opener=urllib2.build_opener(处理程序)
urllib2.install_opener(开启器)
导入功能工具
导入httplib
导入urllib2
类BoundHTTPHandler(urllib2。HTTPHandler):
def __init__(self,source_address=None,debuglevel=0):
URL lib 2 . httphandler . _ _ init _ _(self,debuglevel)
self . http _ class=func tools . partial(http lib。HTTPConnection,
源地址=源地址)
def http_open(self,req):
返回self.do_open(self.http_class,req)
handler=BoundHTTPHandler(source _ address=(' 192 . 168 . 1 . 10 ',0))
opener=urllib2.build_opener(处理程序)
urllib2.install_opener(开启器)
然后就是现成的模块netifaces。其实netifaces模块只是上述socket绑定ip的功能封装。
地址:
导入netifaces
netifaces.interfaces()
neti faces . I addresses(' lo0 ')
netifaces。AF_LINK
addrs=neti faces . if addresses(' lo0 ')
addrs[netifaces。AF_INET]
[{'peer': '127.0.0.1 ',' netmask': '255.0.0.0 ',' addr': '127.0.0.1'}]
导入netifaces
netifaces.interfaces()
neti faces . I addresses(' lo0 ')
netifaces。AF_LINK
addrs=neti faces . if addresses(' lo0 ')
addrs[netifaces。AF_INET]
[{'peer': '127.0.0.1 ',' netmask': '255.0.0.0 ',' addr': '127.0.0.1'}]
感谢您的阅读,希望能帮到您,也感谢您对本站的支持!