python使用动态ip抓取网页

当我们从网站抓取一条信息时,如果我们经常访问它,它可能会被被访问的网站检测到并被阻止。解决这个问题的方法之一是使用代理ip。当我们上网时,我们的电脑会被分配一个IP让我们尝试。当我们频繁访问一个网站时,网站会被阻止,因为我们发现同一个IP地址被访问了很多次。此时,更改IP地址是最好的解决方案。此时如果我们使用多个不同的头,此时会出现多个ip+主机的组合,访问时被发现的概率会进一步降低。
 
 
关于代码中ip代理的使用,介绍如下:
 
步骤:
 
1.urllib2库中的ProxyHandler类,通过它可以使用ip代理来访问网页。
 
proxy _ support = urllib 2 . proxy handler({ }),其中参数是字典{'type':' proxy ip:端口号' }。
 
2、定制和创建一个开瓶器。
 
open er = urllib 2 . build _ open er(proxy _ support)
 
3.(1)安装开启器。
 
urlib2.install_opener(opener)
 
(2)调用默认的开瓶器。
 
open . open(URL)
 
对于没有反爬虫机制的网站,我们只需要直接引入如上的ProxyHandler类进行处理,以访问csdn主页为例:
 
导入urllib
 
url="http://www.csdn.net/"
 
对于范围内的I(0,10000):
 
html=urllib.urlopen(url)
 
打印html.info()
 
使用上述代码时,当循环到20时,将出现以下错误。
 
追溯(最近一次通话持续时间):
文件“C:/Users/Lenovo/pycharmports/untitle 1/jt2/_ _ init _ _。py”,第19行,中
html=urllib.urlopen(url)
文件“C:Python27liburllib.py”,第87行,在urlopen中
返回开启器. open(url)
文件“C:python 27 LiberLib . py”,第213行,处于打开状态
返回getattr(自我,姓名)(url)
open_http中第350行的文件“C:Python27liburllib.py”
h.endheaders(数据)
文件“C:Python27libhttplib.py”,第997行,在endheaders中
自我。_发送输出(消息正文)
文件“C:Python27libhttplib.py”,第850行,in _send_output
self.send(消息)
文件“C:Python27libhttplib.py”,第812行,发送中
self.connect()
文件“C:Python27libhttplib.py”,第793行,在connect中
self.timeout,self.source_address)
create_connection中的文件“C:Python27libsocket.py”,第571行
引发错误
IOError: [Errno套接字错误] [Errno 10060]
 
这是因为我们使用计算机的单个ip进行频繁访问并被检测到。
 
以下是使用ip代理的代码:
 
导入urllib2
 
随机导入
 
def getHtml(url,代理):
 
random_proxy = random.choice(代理)
 
proxy_support = urllib2。proxy handler({“http”:random _ proxy })
 
open er = urllib 2 . build _ open er(proxy _ support)
 
urllib2.install_opener(opener)
 
html=urllib2.urlopen(url)
 
返回html
 
url="http://www.csdn.net/"
 
代理=["101.53.101.172:9999 "、" 171.117.93.229:8118 "、" 119.251.60.37:21387 "、" 58.246.194.70:8080 "
 
"115.173.218.224:9797","110.77.0.70:80"]
 
对于范围内的I(0,10000):
 
尝试:
 
html=getHtml(url,代理)
 
打印。info () #打印网页的标题信息只是为了显示您已经访问过该网页,并且可以将其修改为您想要显示的内容。
 
打印I
 
除了:
 
打印“已失败”
 
在1096次测试中检测到此代码。我们应该知道我的列表中只有6个IP。如果我们增加IPs的数量,被发现的概率会不会再次降低?至于上例中的ip代理,可能过了一段时间就不用了,需要在网上搜索最新的ip代理进行更换。此外,程序中的异常处理是为了使程序能够处理访问ip代码时出现的问题,因为一些ip代理在访问时会失败,这可以使程序更加健壮。
 
对于具有反爬虫机制的网页,以下是访问csdn中博客的示例:
 
#编码:utf-8
 
导入urllib2
 
随机导入
 
def get_html(url、标头、代理):
 
random_userAget = random.choice(标头)
 
random_proxy = random.choice(代理)
 
#以下是模拟的浏览器访问。
 
req = urllib2。请求(网址)
 
req.add_header(“用户代理”,random_userAget)
 
req.add_header("GET ",url)
 
req.add_header("Host "," blog.csdn.net ")
 
req.add_header("Referer "," http://blog.csdn.net/?&page=6”)
 
#以下是使用ip代理的访问。
 
proxy_support = urllib2。proxy handler({“http”:random _ proxy })
 
open er = urllib 2 . build _ open er(proxy _ support)
 
urllib2.install_opener(opener)
 
html = urllib2.urlopen(req)
 
返回html
 
url = "http://blog.csdn.net/?&page=3 "
 
使用来自多个主机的user_agent信息形成一个列表。当然,这个列表中所有的user _ agents都是不完整的,使用的时候可以自己去找。
 
用户代理= [
 
“Mozilla/5.0(Windows NT 6.3;苹果我们.。。hrome/45 . 0 . 2454 . 101 Safari/537.36 ",
 
“Mozilla/5.0(Windows NT 6.1)apple WebKit/537。。。。。likeGecko)Chrome/45 . 0 . 2454 . 101 safari/537.36”,
 
" Mozilla/5.0(Windows NT 10.0;苹果网络工具包.。。。。gecko)Chrome/50 . 0 . 2661 . 102 Safari/537.36”,
 
" Mozilla/5.0(Windows NT 6.1;苹果网络工具包/537.3 .。。。ML,像Gecko)Chrome/49 . 0 . 2623 . 112 Safari/537.36”,
 
"用户代理:Mozilla/5.0(Windows NT 10.0;Win64x64 ).。。WebKit/537.36 (KHTML,像Gecko)Chrome/46 . 0 . 2486 . 0 Safari/537.36 Edge/13.10586”,
 
"用户代理:Mozilla/5.0(Windows NT 10.0)applebwebki .。。。。36 (KHTML,喜欢Gecko)Chrome/46 . 0 . 2486 . 0 Safari/537.36 Edge/13 . 10586”,
 
" Mozilla/5.0(Windows NT 10.0;苹果公司.。。。。KHTML,像Gecko)Chrome/50 . 0 . 2661 . 94 Safari/537.36 "

#互联网上的ip可能不可用,所以您需要尝试更多。
 
my proxy =[" 220 . 189 . 249 . 80:80 "、" 124.248.32.43:80"]
 
html = get_html(url、用户代理、我的代理)
 
打印html.read()