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