最近需要用爬虫爬一些图片,但是经常遇到报错如下:
requests.exceptions.ConnectionError: HTTPConnectionPool(host='www.xxxxxx.com', port=80): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [WinError 10060]
//或者下面这个报错
urllib.error.HTTPError: HTTP Error 403: Forbidden
实际上由于网络连接不稳定或者被网站误认为是攻击而强制关闭连接,都可能导致我们的爬虫程序运行失败,下面是我个人利用异常处理实现的一个在出现报错后继续运行的方法:
import requests
import time
import json
from tqdm import tqdm
url = 'https://www.xxxx.com' #需求爬取的url
for item in tqdm(items): # items是需要爬取的list,tqdm是一个简易进度条,不想看进度条可以直接for item in items:
From_data = {'text': item} # 传入requests的数据
while True: # 相当于一直请求,直到成功后break
try:
response = requests.post(url, data=From_data) # 如果这个请求失败,那么并不会运行break,将运行except中的代码
break # 能运行到这一步说明请求成功,可以跳出循环了
except:
time.sleep(1) # 暂停1秒,之后回到while True继续请求
print('---------sleep----------')
content = json.loads(response.text)# 跳出循环后对得到的数据处理
总结来说,就是利用while True和出现异常不会继续往下运行,构成不断请求直至成功的循环,同时也把报错给吃了,不会中断程序,也不必每次都sleep1秒,理论上速度更快。
对于自己的爬虫可以进行相似的改造,大致结构如下:把请求和数据处理换成自己的即可。
for item in items:
while True:
try:
response = requests.post(url, data=From_data) #请求
break
except:
time.sleep(1)
print('---------sleep----------')
content = json.loads(response.text)# 对得到的数据处理