在爬蟲程式本地測試執行通過之後,一些同學就迫不及待的將程式部署到伺服器上進行正式執行,然後跑一段時間之後就出現了各種錯誤甚至程式退出,這裡將一些常見的問題整理下供參考:
1、本地除錯通過只是說明程式從請求到資料分析的流程已經完整了,但是並不代表程式能長期穩定的採集資料,針對採集的網站需要進行自動化測試,一般建議按照一定次數或時間進行穩定性測試,看看網站的響應情況和反爬情況
2、程式需要加上資料處理的異常保護,如果是資料要求不高,可以單執行緒執行,如果資料要求較高,建議加上多執行緒執行,提高程式的處理效能
3、根據採集的資料要求和網站情況,配置適當的爬蟲代理,這樣可以降低網站反爬的風險,爬蟲代理的選擇對比中,要重點關注網路延遲、IP池大小和請求成功率,這樣可以快速選擇適合的爬蟲代理產品
下面提供一個demo程式,用來統計請求和IP分佈,也可以根據需求修改成資料採集程式:
#! -*- encoding:utf-8 -*-
import requests
import random
import requests.adapters
# 要訪問的目標頁面
targetUrlList = [
"https://httpbin.org/ip",
"https://httpbin.org/headers",
"https://httpbin.org/user-agent",
]
# 代理伺服器(產品官網 www.16yun.cn)
proxyHost = "t.16yun.cn"
proxyPort = "31111"
# 代理驗證資訊
proxyUser = "username"
proxyPass = "password"
proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
"host": proxyHost,
"port": proxyPort,
"user": proxyUser,
"pass": proxyPass,
}
# 設定 http和https訪問都是用HTTP代理
proxies = {
"http": proxyMeta,
"https": proxyMeta,
}
# 設定IP切換頭
tunnel = random.randint(1, 10000)
headers = {"Proxy-Tunnel": str(tunnel)}
class HTTPAdapter(requests.adapters.HTTPAdapter):
def proxy_headers(self, proxy):
headers = super(HTTPAdapter, self).proxy_headers(proxy)
if hasattr(self, 'tunnel'):
headers['Proxy-Tunnel'] = self.tunnel
return headers
# 訪問三次網站,使用相同的tunnel標誌,均能夠保持相同的外網IP
for i in range(3):
s = requests.session()
a = HTTPAdapter()
# 設定IP切換頭
a.tunnel = tunnel
s.mount('https://', a)
for url in targetUrlList:
r = s.get(url, proxies=proxies)
print r.text
本作品採用《CC 協議》,轉載必須註明作者和本文連結