Python クローラーが例外処理をスキップする
最近、いくつかの写真をクロールするためにクローラーを使用する必要がありますが、次のようなエラーが頻繁に発生します。
requests.exceptions.ConnectionError: HTTPConnectionPool(host='www.xxxxxx.com', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x0334D290>: Failed to establish a new connection: [WinError 10060]
//或者下面这个报错
urllib.error.HTTPError: HTTP Error 403: Forbidden
アプローチ
実は、ネットワーク接続が不安定だったり、Webサイトに攻撃と誤認されて強制的に接続を切断されたりして、クローラープログラムが動かなくなってしまうことがあるのですが、例外処理を使って動かし続ける方法として、以下は私自身が実践した方法です。エラーが発生した後:
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 と例外を使用すると、実行が継続されず、成功するまで継続的なリクエストのサイクルが形成され、同時にエラー レポートが消費され、プログラムが中断されず、1 秒間スリープする必要がなくなります。毎秒秒、理論的にはより速くスピードアップします。
独自のクローラーに同様の変更を加えることができます。一般的な構造は次のとおりです。リクエストとデータ処理を独自のものに置き換えるだけです。
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)# 对得到的数据处理