如何解決網站登入後反爬的問題?

mmz_77發表於2023-02-16
在爬取網頁資料的過程中,我們經常會遇到一些需要登入才能訪問的網站,這時候我們就需要模擬登入的過程,獲取登入後的cookies,然後帶著cookies去請求資料。但是有些網站在登入後還會採取一些反爬的措施,比如檢查請求頭中的User-Agent、Referer等欄位,或者在一定時間內限制同一IP的訪問次數或頻率,導致我們的爬蟲無法正常獲取資料。那麼,我們該如何解決這類網站登入後反爬的問題呢?

一種方法是修改我們的請求頭,讓我們的爬蟲看起來更像一個真實的瀏覽器,比如隨機更換User-Agent、Referer等欄位,或者新增一些其他的欄位,比如Accept、Accept-Encoding、Accept-Language等,來增加我們的請求頭的複雜度和真實性。

另一種方法是使用代理IP,讓我們的爬蟲每次請求都使用不同的IP地址,從而避免被網站封禁。我們可以使用一些免費或付費的代理IP服務,比如Tor、Luminati、Scrapy Proxy Pool等,來獲取代理IP,然後在我們的請求中新增代理IP的引數,比如proxies、proxy_auth等,來使用代理IP。

透過以上兩種方法,我們就可以提高我們的爬蟲的抗反爬能力,成功爬取網站登入後的資料。當然,這些方法並不是萬能的,有些網站可能還會採用更復雜的反爬手段,比如驗證碼、動態頁面、引數加密等,這時候我們就需要使用更高階的爬蟲技術,比如OCR、Selenium、Requests、BeautifulSoup等,來解決這些障礙。但是這些技術的使用也會增加我們的爬蟲的開發和維護的難度和成本,所以我們需要根據我們的爬蟲的目的和需求,來選擇合適的爬蟲方法和技術。

在爬取一些需要登入才能訪問的網站時,我們可以使用selenium來模擬瀏覽器的行為,自動填寫使用者名稱和密碼,點選登入按鈕,獲取登入後的cookies,然後用requests或urllib等庫來請求資料。但是有些網站會對登入後的使用者進行反爬檢測,比如檢查請求頭中的User-Agent、Referer等欄位,或者限制同一IP地址在一定時間內的訪問次數或頻率,導致我們的爬蟲無法正常獲取資料。那麼,我們該如何使用selenium和代理IP來爬取需要登入的網站呢?
一種方法是使用代理IP服務,比如億牛雲等,來更換我們的IP地址,避免被網站封禁。我們可以購買代理IP服務,並使用其提供的API或SDK來獲取代理IP,並在我們的selenium或requests中新增代理IP引數,比如proxies、proxy_auth等。這樣我們就可以每次請求都使用不同的IP地址。

另外,在使用代理IP時,我們還需要注意一點:因為網站需要先登入才能進行其他操作,所以我們需要保持同一個IP完成一系列操作才能切換到下一個。否則如果每次請求都換一個IP地址,可能會導致登入失效或者被識別為異常行為。幸運的是,有些代理IP服務提供了Keep-Alive功能,可以保持相同代理IP進行採集,並進行狀態判斷,失敗後重新發起。這樣就可以避免頻繁切換IP地址而引起問題。

透過以上兩種方法,我們就可以使用selenium和代理IP來爬取需要登入的網站。當然,在實際操作中還要注意其他細節問題,比如設定合適的延時、異常處理、資料儲存等。下面給出一個簡單的程式碼示例: 

# 匯入相關庫
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 設定億牛雲API介面和賬號資訊
api_url = "
username = "xxx"
password = "xxx"
# 獲取代理IP
def get_proxy():
    response = requests.get(api_url)
    if response.status_code == 200:
        data = response.json()
        if data["code"] == 0:
            ip = data["data"][0]["ip"]
            port = data["data"][0]["port"]
            proxy = f"http://{username}:{password}@{ip}:{port}"
            return proxy
        else:
            print(data["msg"])
    else:
        print("獲取代理失敗")
# 模擬登入並獲取cookies
def login_and_get_cookies():
    # 建立瀏覽器物件,並設定選項
    options = webdriver.ChromeOptions()
    # 設定無頭模式(不顯示瀏覽器視窗)
    options.add_argument("--headless")
    # 設定代理引數
    proxy = get_proxy()
    options.add_argument(f"--proxy-server={proxy}")
    # 建立瀏覽器物件,並傳入選項
    browser = webdriver.Chrome(options=options)
    
    # 訪問目標網站(以百度為例)
    browser.get(")



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31522063/viewspace-2935626/,如需轉載,請註明出處,否則將追究法律責任。

相關文章