一、SSL证书问题
上一篇文章,我们创建了一个小爬虫,下载了上海链家房产的几个网页。实际上我们在使用urllib联网的过程中,会遇到证书访问受限的问题。
处理HTTPS请求SSL证书验证,如果SSL证书验证不通过,会警告用户证书不受信任(即没有通过AC认证)。
上图左边我们可以看到SSL验证失败,所以以后遇到这些网站我们需要单独处理SSL证书,让程序主动忽略SSL证书验证错误,即可正常访问。例如我们访问12306。
from urllib import request
#导入python的SSL处理模块
import ssl #忽略SSL验证失败
context=ssl._create_unverified_context() url="https://www.12306.cn/mormhweb/" response=request.urlopen(url,context=context)
html=response.read()
print(html)
二、Handler处理器以及自定义opener
我们之前一直使用的urlopen,它是一个模块帮我们构建好的特殊的opener。但是这个基本的urlopen()是不支持代理、cookie等其他的HTTP/HTTPS高级功能。所以我们需要利用Handler处理器自定义opener,来满足我们需要的这些功能。
import urllib.request url="http://www.whatismyip.com.tw/" #该参数是一个字典类型,键表示代理的类型,值为代理IP和端口号
proxy_support=urllib.request.ProxyHandler({'http':'117.86.199.19:8118'}) #接着创建一个包含代理的opener
opener=urllib.request.build_opener(proxy_support)
opener.addheaders=[("User-Agent","Mozilla/5.0(Macintosh;U;IntelMacOSX10_6_8;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50")] #第一种方式是使用install_opener()安装进默认环境,那么以后你使用urlopen()函数,它都是以你定制的opener工作的
urllib.request.install_opener(opener)
response=urllib.request.urlopen(url) #第二种使用一次性的opener.open()打开
#req=urllib.request.Request(url)
#response=opener.open(req) html=response.read().decode('utf-8')
print(html)
我们可以看到,访问网站的IP已经被换成了代理IP。在以上的设置代理的过程中,我们也使用addheaders这一函数,给请求附加了UserAgent,UserAgent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,UserAgent也简称UA。它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。这也是对抗反爬虫的常用手段之一。