当我们从网站抓取一条信息时,如果我们经常访问它,它可能会被被访问的网站检测到并被阻止。解决这个问题的方法之一是使用代理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()