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

# 代理服务器的设置
# 有时使用同一个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 data


proxy_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证书,证书类似于一个解密的签名。
# 另外是加密,加密需要一个密钥交换算法,双方通过交换后的密钥加解密。
posted @ 2020-05-11 22:30  一个土豆芽  阅读(420)  评论(0编辑  收藏  举报