首页 > 编程知识 正文

Python爬虫使用动态ip切换防止阻塞

时间:2023-05-06 08:47:30 阅读:110713 作者:3669

我上次说过,我在新公司的部分工作是负责爬虫业务。爬虫机器有几百台,节点要计划移入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'}]

感谢您的阅读,希望能帮到您,也感谢您对本站的支持!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。