Python 爬虫使用动态切换ip防止封杀
对于爬虫被封禁 ! 爬虫一般来说只要你的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
Python 爬虫使用动态切换ip防止封杀的更多相关文章
- Python爬虫教程-11-proxy代理IP,隐藏地址(猫眼电影)
Python爬虫教程-11-proxy代理IP,隐藏地址(猫眼电影) ProxyHandler处理(代理服务器),使用代理IP,是爬虫的常用手段,通常使用UserAgent 伪装浏览器爬取仍然可能被网 ...
- GuozhongCrawler看准网爬虫动态切换IP漫爬虫
有些关于URL去重的方面代码没有提供,须要自己去实现.主要这里提供思路 项目地址:http://git.oschina.net/woshidaniu/GuozhongCrawler/tree/mast ...
- Python爬虫之-动态网页数据抓取
什么是AJAX: AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML.过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新.这意 ...
- python爬虫批量抓取ip代理
使用爬虫抓取数据时,经常要用到多个ip代理,防止单个ip访问太过频繁被封禁.ip代理可以从这个网站获取:http://www.xicidaili.com/nn/.因此写一个python程序来获取ip代 ...
- 静听网+python爬虫+多线程+多进程+构建IP代理池
目标网站:静听网 网站url:http://www.audio699.com/ 目标文件:所有在线听的音频文件 附:我有个喜好就是听有声书,然而很多软件都是付费才能听,免费在线网站虽然能听,但是禁ip ...
- python爬虫学习之查询IP地址对应的归属地
话不多说,直接上代码吧. import requests def getIpAddr(url): response = requests.get(url) response.encoding=resp ...
- Python爬虫篇(代理IP)--lizaza.cn
在做网络爬虫的过程中经常会遇到请求次数过多无法访问的现象,这种情况下就可以使用代理IP来解决.但是网上的代理IP要么收费,要么没有API接口.秉着能省则省的原则,自己创建一个代理IP库. 废话不多说, ...
- Python 爬虫抓取代理IP,并检测联通性
帮朋友抓了一些代理IP,并根据测试联的通性,放在了不通的文件夹下.特将源码分享 注意: 1,环境Python3.5 2,安装BeautifulSoup4 requests 代码如下: 1 2 3 4 ...
- python爬虫爬取代理IP
# #author:wuhao # #--*------------*-- #-****#爬取代理IP并保存到Excel----#爬取当日的代理IP并保存到Excel,目标网站xicidaili.co ...
随机推荐
- Java实现windows,linux服务器word,excel转为PDF;aspose-words,Documents4j
Java实现windows,linux服务器word,excel转为PDF:aspose-words,Documents4j 一.通过aspose-words将word,Excel文档转为PDF 1. ...
- Java——break,continue,return语句
break语句: break:用于改变程序控制流 用于do-while.while.for中时,可跳出循环而执行循环后面的语句. break的作用:终止当前循环语句的执行. break还可以用来终止s ...
- 提高效率的Linux命令
提高效率的Linux命令 一.fc 二.disown 三.Ctrl + x +e 四.!! 两个感叹号 五.一次创建多个目录或文件 六.tee 七.删除从开头到光标处的命令文本 八.删除从光标到结尾处 ...
- 将一个 JavaBean 对象转化为一个 Map
package com.loan.modules.common.util; import java.beans.BeanInfo; import java.beans.IntrospectionExc ...
- Flink-v1.12官方网站翻译-P009-Event-driven Applications
事件驱动的应用 处理函数 简介 ProcessFunction将事件处理与定时器和状态结合起来,使其成为流处理应用的强大构件.这是用Flink创建事件驱动应用的基础.它与RichFlatMapFunc ...
- c++bind函数使用
总述 最近写代码的时候看到代码使用了bind,一个参数绑定的标准库函数.程序是这么写的, speaker_play_routine_ = new boost::thread (boost::b ...
- 宝塔Linux面板FTP无法连接的解决办法
我使用的是阿里云服务器,需要在安全组设置中,对22.21端口放行,并且被动端口(39000 - 40000)也需要处于放行状态(即是指在阿里云安全组的添加端口范围为 39000/40000 的设置) ...
- XML、DTD约束
XML的作用: xml现在主要用于配置文件 文档声明: 如果你使用记事本打开文档,此时如果记事本默认保存数据到硬盘根据的是"GB2312"编码,这个时候如果你在xml文档源码中en ...
- 【原创】kubernetes之CNI理解
一.什么是CNI? CNI-容器网络接口,CNI(容器网络接口)是Cloud Native Computing Foundation项目,由一个规范和库(用于编写用于在Linux容器中配置网络接口的插 ...
- 2.了解nginx常用的配置
作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-07-10 20:56:10 星期三 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...