91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python爬蟲實戰之抓取異常的處理方法

發布時間:2020-11-30 10:09:55 來源:億速云 閱讀:195 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關python爬蟲實戰之抓取異常的處理方法的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

可能在抓取的時候,某個賬號突然就被封了,或者由于網絡原因,某次請求失敗了,該如何處理?對于前者,我們需要判斷每次請求返回的內容是否符合預期,也就是看response url是否正常,看response content是否是404或者讓你驗證手機號等,對于后者,我們可以做一個簡單的重試策略。處理這兩種情況的代碼如下

@timeout_decorator
def get_page(url, user_verify=True, need_login=True):
    """
    :param url: 待抓取url
    :param user_verify: 是否為可能出現驗證碼的頁面(ajax連接不會出現驗證碼,如果是請求微博或者用戶信息可能出現驗證碼),否為抓取轉發的ajax連接
    :param need_login: 抓取頁面是否需要登錄,這樣做可以減小一些賬號的壓力
    :return: 返回請求的數據,如果出現404或者403,或者是別的異常,都返回空字符串
    """
    crawler.info('本次抓取的url為{url}'.format(url=url))
    count = 0
 
    while count < max_retries:
 
        if need_login:
            # 每次重試的時候都換cookies,并且和上次不同,如果只有一個賬號,那么就允許相同
            name_cookies = Cookies.fetch_cookies()
            
            if name_cookies is None:
                crawler.warning('cookie池中不存在cookie,正在檢查是否有可用賬號')
                rs = get_login_info()
 
                # 選擇狀態正常的賬號進行登錄,賬號都不可用就停掉celery worker
                if len(rs) == 0:
                    crawler.error('賬號均不可用,請檢查賬號健康狀況')
                    # 殺死所有關于celery的進程
                    if 'win32' in sys.platform:
                        os.popen('taskkill /F /IM "celery*"')
                    else:
                        os.popen('pkill -f "celery"')
                else:
                    crawler.info('重新獲取cookie中...')
                    login.excute_login_task()
                    time.sleep(10)
 
        try:
            if need_login:
                resp = requests.get(url, headers=headers, cookies=name_cookies[1], timeout=time_out, verify=False)
 
                if "$CONFIG['islogin'] = '0'" in resp.text:
                    crawler.warning('賬號{}出現異常'.format(name_cookies[0]))
                    freeze_account(name_cookies[0], 0)
                    Cookies.delete_cookies(name_cookies[0])
                    continue
            else:
                resp = requests.get(url, headers=headers, timeout=time_out, verify=False)
 
            page = resp.text
            if page:
                page = page.encode('utf-8', 'ignore').decode('utf-8')
            else:
                continue
 
            # 每次抓取過后程序sleep的時間,降低封號危險
            time.sleep(interal)
 
            if user_verify:
                if 'unfreeze' in resp.url or 'accessdeny' in resp.url or 'userblock' in resp.url or is_403(page):
                    crawler.warning('賬號{}已經被凍結'.format(name_cookies[0]))
                    freeze_account(name_cookies[0], 0)
                    Cookies.delete_cookies(name_cookies[0])
                    count += 1
                    continue
 
                if 'verifybmobile' in resp.url:
                    crawler.warning('賬號{}功能被鎖定,需要手機解鎖'.format(name_cookies[0]))
        
                    freeze_account(name_cookies[0], -1)
                    Cookies.delete_cookies(name_cookies[0])
                    continue
 
                if not is_complete(page):
                    count += 1
                    continue
 
                if is_404(page):
                    crawler.warning('url為{url}的連接不存在'.format(url=url))
                    return ''
 
        except (requests.exceptions.ReadTimeout, requests.exceptions.ConnectionError, AttributeError) as e:
            crawler.warning('抓取{}出現異常,具體信息是{}'.format(url, e))
            count += 1
            time.sleep(excp_interal)
 
        else:
            Urls.store_crawl_url(url, 1)
            return page
 
    crawler.warning('抓取{}已達到最大重試次數,請在redis的失敗隊列中查看該url并檢查原因'.format(url))
    Urls.store_crawl_url(url, 0)
return ''

這里大家把上述代碼當一段偽代碼讀就行了,主要看看如何處理抓取時候的異常。因為如果貼整個用戶抓取的代碼,不是很現實,代碼量有點大。

感謝各位的閱讀!關于python爬蟲實戰之抓取異常的處理方法就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

定州市| 镇赉县| 阳山县| 门源| 阳春市| 岗巴县| 宁陕县| 德钦县| 新津县| 大田县| 英吉沙县| 惠来县| 新余市| 锡林郭勒盟| 江北区| 河津市| 周口市| 石阡县| 深水埗区| 余干县| 永城市| 托里县| 五原县| 三明市| 沂南县| 祁阳县| 古丈县| 湘阴县| 洛阳市| 扬中市| 孟村| 江门市| 龙川县| 晋江市| 通河县| 北宁市| 图木舒克市| 普格县| 永康市| 江达县| 竹溪县|