在进行Python爬虫开发时,我们有时会爬取一些https网站,这时候可能会遇到一些错误。本文将就这个问题进行一些详细的说明,并介绍Python自带的一些库。
一、爬取https网站出现的错误
1. SSL证书验证错误
由于https协议要求服务器返回的证书必须是经过权威CA机构授权的,因此如果我们自己在爬虫中发起请求时,没有携带正确的证书或者证书不受浏览器信任,就会遇到证书验证错误。这时候我们可以通过设置验证策略来跳过证书验证,代码如下所示:
```
import urllib.request
import ssl
context = ssl._create_unverified_context()
response = urllib.request.urlopen(url, context=context)
```
2. DNS解析错误
当我们尝试从https网站下载内容时,发现程序无法解析域名或者解析超时,这可能是由于DNS服务器无法解析该名称,或者DNS服务器返回的IP地址被防火墙过滤了。我们可以在代码中关闭DNS缓存,代码如下所示:
```
import urllib.request
import socket
socket.setdefaulttimeout(20) #设置超时时间
urllib.request.socket.setdefaulttimeout(20)
urllib.request.urlcleanup() #清除缓存
response = urllib.request.urlopen(url)
```
3. HTTP Error 403: Forbidden
当我们尝试访问https网站时,可能会发现程序返回了HTTP Error 403: Forbidden的错误。这是因为该网站在服务器端设置了一些安全措施,禁止了程序的访问。我们可以在程序中模拟浏览器访问,伪装成人类用户,代码如下所示:
```
import urllib.request
import urllib.error
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
req = urllib.request.Request(url=url, headers=headers)
try:
response = urllib.request.urlopen(req)
except urllib.error.HTTPError as e:
if e.code == 403:
pass
```
4. Connection reset by peer
当我们向https网站发起请求时,可能会出现Connection reset by peer的错误。这是因为服务器端将连接重置了,可能是由于服务器端限制了连接数或者访问频率。我们可以设置一个sleep延迟,让程序暂停一段时间后再次尝试发起请求,代码如下所示:
```
import time
import urllib.request
import urllib.error
while True:
try:
response = urllib.request.urlopen(url)
break
except urllib.error.URLError as e:
print(e)
time.sleep(5)
continue
```
二、Python自带的库
1. urllib
Python标准库中提供了urllib库,它是一个URL处理库,可以用来抓取URL内容、进行URL解析、发送HTTP请求等操作。其中urllib.request模块可以用来发送HTTP/HTTPS请求。
2. requests
Python标准库中的urllib虽然功能强大,但是使用起来比较麻烦,如果我们只是需要进行简单的HTTP/HTTPS请求,我们可以使用requests库。requests是一个第三方库,是一个简单易用的HTTP请求库,支持HTTP/HTTPS等协议。
3. ssl
ssl是Python标准库中提供的一个库,用于安全套接字层的操作。在爬取https网站时,我们可能会遇到SSL证书验证错误,可以使用ssl._create_unverified_context()来跳过证书验证。
4. socket
socket是Python标准库中提供的一个库,用于实现网络通信相关的功能。我们可以通过该库中的方法设置超时时间、关闭DNS缓存、设置socket的缓冲区大小等参数。
5. time
time是Python标准库中提供的一个库,用于实现和时间有关的功能。在爬取https网站时,我们可能会被服务器限制连接数或访问频率,可以使用time.sleep()来设置程序的停留时间。
总结:
本文主要介绍了Python爬取https网站出现错误时的解决方法,并简单介绍了Python标准库中的一些常用库。在进行爬虫开发时,我们需要根据实际情况选择合适的库和解决办法,提高程序的可靠性和稳定性。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/
发表评论 取消回复