爬虫第五节 代理服务器设置

# 代理服务器的设置# 有时使用同一个ip去爬取同一个网站上的网页,久了之后会被该网站服务器屏蔽。那么怎样解决这个问题呢?# 解决的思路很简单,即“瞒天过海,暗度陈仓”。# 如果我们爬取别人网站的时候,在对方服务器上显示的是别人的ip地址,那么,即使 对方将显示出来的这个ip地址屏蔽了,也无关紧要,# 因为我们可以换另一个ip地址继续 爬取。# 使用代理服务器,就可以很好地解决这个问题。使用代理服务器去爬取某个网站的内容 的时候,# 在对方网站上,显示的不是我们真实的ip地址,# 而是代理服务器的ip地址。并且 在Python爬虫中,使用代理服务器设置起来也很简单。# 那么这些代理服务器可以从哪里找到呢?我们可以在互联网中搜索对应的代理服务器地址,# 当然也可以从整理好的网址http://www.xicidaili.com/nt/1中找到很多代理服务器地址。#通过网站就可以看到,这里会更新很多代理IP地址,我们尽量找验证时间比较短的,这些成功的概率会比较大,一些验证时间较长的,可能会失效。# 举例:我们可以选择第二个代理IP地址202.75.210.45,对应的端口号是7777,# 所以呢 ,完整的 格式为:“网址:端口号”,即 202.75.210.45:7777。# 用了代理IP地址之后,我们就可以进行相应程序的编写了、可以使用以下程序,实现 通过代理服务器来爬取网站内容。# 实例如下def use_proxy(proxy_addr, url):    import urllib.request    proxy = urllib.request.ProxyHandler({‘http‘: proxy_addr})    opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)    urllib.request.install_opener(opener)    data = urllib.request.urlopen(url).read().decode(‘utf-8‘)    return dataproxy_addr = "113.240.254.154:8080"data = use_proxy(proxy_addr, "https://www.baidu.com")print(len(data))# 我们首先建立一个名为use_proxy的自定义函数,该函数主要实现使用代理服务器来爬取某个URL网页的功能。# 在函数中,我们设置两个形参,第一个形参为代理服务器的地址,第二个形参代表要爬取的网页的地址。# 然后,使用urllib.request.ProxyHandler()来设置对应的代理服务器信息,# 设置格式为: urllib.request.ProxyHandler ( {‘http‘:代理服务器地址}),# 接下来,使用 urllib.request.build_ opener()创建了一个自定义的opener对象,# 其中第一个参数为代理信息,第二个参数为urllib. request.HTTPHandler类。# 为了方便,可以使用urllib.request.install_opener()创建全局默认的opener对象,# 那在使用urlopen()时亦会使用我们安装的opener对象,# 所以我们下面才可以直接使用urllib. request.urlopen()打开对应网址爬取网页并读取,编码后赋给变量data,最后返回data的值给函数。# 随后,在函数外设置好对应的代理IP地址,然后调用自定义函数use_proxy,并传递两 个实参,分别为使用的代理地址及要爬取的网址。# 将函数的调用结果赋值给变量data,并输 出data内容的长度。当然,也可以将data的值写进某个文件当中存储起来。# 执行下来就可以看到成功使用代理服务器爬取到了百度首页,并返回获取内容的大小。# 如果 此时代理服务器地址失效或填写错了代理服务器,则会发生错误,# 出现# urllib.error.URLError: <urlopen error [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。## 其中还有另外一个错误的可能# 如果出现以上错误除了找IP的问题还有就是http协议的问题# 解决办法:# 只是把协议改了一下就可以:# ‘http’-》‘https’,# 增加一点别的知识:# https就是http和TCP之间有一层SSL层,# 这一层的实际作用是防止钓鱼和加密。防止钓鱼通过网站的证书,网站必须有CA证书,证书类似于一个解密的签名。# 另外是加密,加密需要一个密钥交换算法,双方通过交换后的密钥加解密。

相关推荐