python爬虫自动更换ip_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的对象,然后你就轮吧 !   跟一些业界做专门做爬虫的人聊过,他们用的基本都是这样的技术。

# -*- 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来构造的出口的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'}]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux nohup不生成日志,linux重定向及nohup不输出的方法

FreeBSD可以同时运行多个进程,在shell下直接输入命令后,shell将进程放到前台执行。如果要将进程放到后台执行,需要在命令行的结尾加上一个 “&” 符号。下面的命令从后台执行,从ftp.isc.org下载文件。$ fetch ftp://ftp.isc.o…

Java BigInteger类| 带实例的splitAndRemainder()方法

BigInteger类divideAndRemainder()方法 (BigInteger Class divideAndRemainder() method) divideAndRemainder() method is available in java.math package. splitAndRemainder()方法在java.math包中可用。 divideAndRemainder() method returns BigInteger array of 2 elemen…

SpringMVC Mybatis Shiro RestTemplate的实现客户端无状态验证及访问控制【转】

2019独角兽企业重金招聘Python工程师标准>>> A.首先需要搭建SpringMVCShiro环境 a1.pom.xml配置 spring: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId><version>4.1.0.RELEAS…

sql服务器默认密码_搭建一个DNS服务器,轻松实现域名解析内容分发,访问速度提高N倍...

DNS服务器&#xff0c;Domain Name Server&#xff0c;域名解析服务器&#xff0c;互联网上相互通信使用的是IP&#xff0c;但是IP是又长又臭又难记&#xff0c;所以创造了域名来解决IP难写难记的问题&#xff0c;记一个g.cn比203.208.50.127强过不知多少倍了。有了域名&#x…

在C ++ STL中使用string :: to_string()将数字转换为字符串

to_string() is a library function of <string> header, it is used to convert numeric value (number) to string. to_string()是<string>标头的库函数&#xff0c;用于将数值(数字)转换为字符串。 Syntax: 句法&#xff1a; string to_string(numberic_value…

门级建模

学习目标 学习Verilog提供的门级原语 理解门的实例引用、门的符号以及and/or&#xff0c;buf/not类型的门的真值表 学习如何根据电路的罗技图来生成Verilog描述 讲述门级设计中的上升、下降和关断延迟 解释门级设计中的最小、最大和典型延迟 1.门的类型 1.1与门&#xff08;and…

linux .net 控制台应用程序,VisualStudioCode创建的asp.net core控制台程序部署到linux

1、asp.net core控制台程序static void Main(string[] args){int times10;while(times>0){Console.WriteLine("Hello World!");times--;Thread.Sleep(1000);}}2、发布发布前&#xff0c;修改test2.csproj文件(项目名称为test2)Exenetcoreapp2.1centos.7-x64主要添…

数组长度属性以及JavaScript中的示例

JavaScript长度属性 (JavaScript length property) length property is used to get and set the length of an array in JavaScript. length属性用于获取和设置JavaScript中数组的长度。 Syntax to get the length of an array: 获取数组长度的语法&#xff1a; array_name.…

怎么挖linux内核的漏洞,linux内核漏洞分析实战看看专家是怎么一步步...-卓优商学院问答...

推荐回答Linux内核调试方法kdb&#xff1a;只能在汇编代码级进行调试&#xff1b;优点是不需要两台机器进行调试。gdb&#xff1a;在调试模块时缺少一些至关重要的功能&#xff0c;它可用来查看内核的运行情况&#xff0c;包括反汇编内核函数。kgdb&#xff1a;能很方便的在源码…

COGS182 [USACO Jan07] 均衡队形[RMQ]

182. [USACO Jan07] 均衡队形 ★★ 输入文件&#xff1a;lineup.in 输出文件&#xff1a;lineup.out 简单对比时间限制&#xff1a;4 s 内存限制&#xff1a;128 MB 题目描述 农夫约翰的 N (1 ≤ N ≤ 50,000) 头奶牛&#xff0c;每天挤奶时总会按同样的顺序站好。一日…

string中concat_JavaScript中带示例的String concat()方法

string中concat字符串concat()方法 (String concat() Method) concat() is a string method in JavaScript, it is used to concatenate (join) two or more strings and returns a new joined string. concat()是JavaScript中的字符串方法&#xff0c;用于连接(联接)两个或多个…

linux全自动备份网站到百度云盘,Linux定时备份数据到百度云盘(示例代码)

导读&#xff1a;如今的百度云盘免费容量都是2T了&#xff0c;即使把电脑上所有的东东都放上去&#xff0c;也还有大把的剩余空间。对于站长来说&#xff0c;是完全可以充分利用这些硬盘空间的&#xff0c;现在我们就用百度云盘来备份Linux服务器上的数据。一直在想&#xff0c…

python dict底层实现_dict实现原理和哈希表

dict底层实现在Python中&#xff0c;字典是依靠散列表或说哈希表(Hash Table)进行实现的&#xff0c;使用开放地址法解决冲突。所以其查找的时间复杂度会是O(1)&#xff0c;下文会具体讲解哈希表的工作原理和解决冲突时的具体方法。也就是说&#xff0c;字典也是一个数组&#…

网际控制报文协议icmp_网络中的ICMP(Internet控制消息协议)

网际控制报文协议icmpICMP(Internet控制消息协议)简介 (Introduction to ICMP (Internet Control Message Protocol)) IP (Internet Protocol) is a network layer protocol. The responsibility of delivering data (Logical Addressing) to any network is done by the IP (I…

谈色

最近很苦恼&#xff0c;像是到了男人的生理期&#xff0c;或者说是类似动物的发情期&#xff0c;见到露长腿的女人总喜欢看。 其实我是并不喜欢这样盯着看&#xff0c;或许是男人的本色&#xff0c;十个男人九个色的本性&#xff0c;总是会不自觉的去偷看&#xff0c;更有甚者还…

linux系统怎样写单片机程序,单片机知识是Linux驱动开发的基础之一以及如何学单片机...

这是arm裸机1期加强版第1课第2、3节课程的wiki文字版。为什么没前途也要学习单片机&#xff1f;因为它是个很好的入口。学习单片机可以让我们抛开复杂的软件结构&#xff0c;先掌握硬件操作&#xff0c;如&#xff1a;看原理图、芯片手册、写程序操作寄存器等。在上一节视频里&…

python教程循环语句_Python教程:关于Python 循环语句

Python 循环语句本章节将向大家介绍Python的循环语句&#xff0c;程序在一般情况下是按顺序执行的。编程语言提供了各种控制结构&#xff0c;允许更复杂的执行路径。循环语句允许我们执行一个语句或语句组多次&#xff0c;下面是在大多数编程语言中的循环语句的一般形式&#x…

math.pow int_Java Math类static int min(int i1,int i2)与示例

math.pow int数学类静态int min(int i1&#xff0c;int i2) (Math Class static int min(int i1 , int i2) ) This method is available in java.lang package. 此方法在java.lang包中可用。 This method is used to return the minimum one of both the given arguments or in…

bat 批处理 常用命令和乱码问题

为什么80%的码农都做不了架构师&#xff1f;>>> rem echo off ECHO OFF XCOPY E:\test.bat D:\ IF ERRORLEVEL 1 ECHO 文件拷贝Failure IF ERRORLEVEL 0 ECHO 文件拷贝Success :start set /p first"1记事本,2远程:" if %first% LEQ 2 (IF %first% …

SuperMap iServer发布的ArcGIS REST 地图服务如何通过ArcGIS API加载

作者&#xff1a;yx 文章目录 一、发布服务二、代码加载三、结果展示 一、发布服务 SuperMap iServer支持将地图发布为ArcGIS REST地图服务&#xff0c;您可以在发布服务时直接勾选ArcGIS REST地图服务&#xff0c;如下图所示&#xff1a; 也可以在已发布的地图服务中&#x…