爬蟲程式實現過程中的一些建議

jackcoden發表於2021-08-12

在爬蟲程式本地測試執行通過之後,一些同學就迫不及待的將程式部署到伺服器上進行正式執行,然後跑一段時間之後就出現了各種錯誤甚至程式退出,這裡將一些常見的問題整理下供參考:

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 協議》,轉載必須註明作者和本文連結

相關文章