簡體   English   中英

python requests.get 總是得到 404

[英]python requests.get always get 404

我想嘗試將 requests.get 發送到此網站

requests.get('https://rent.591.com.tw')

我總是得到

<Response [404]>

我知道這是一個常見問題並嘗試了不同的方法但仍然失敗。 但所有其他網站都可以。

有什么建議嗎?

網絡服務器是黑匣子。 他們可以根據您的請求、一天中的時間、月相或他們選擇的任何其他標准返回任何有效的 HTTP 響應。 如果另一個 HTTP 客戶端得到不同的響應,請始終嘗試找出 Python 發送的請求與另一個客戶端發送的請求之間的差異。

這意味着您需要:

  • 記錄工作請求的所有方面
  • 記錄失敗請求的所有方面
  • 嘗試您可以進行哪些更改以使失敗的請求更像工作請求,並盡量減少這些更改。

我通常將我的請求指向http://httpbin.org端點,讓它記錄請求,然后進行實驗。

對於requests ,有幾個標頭是自動設置的,其中許多標頭通常不需要更改:

  • Host ; 必須設置為您正在聯系的主機名,以便它可以正確地多托管不同的站點。 requests設置了這個。
  • Content-LengthContent-Type ,對於 POST 請求,通常根據您傳遞給requests的參數設置。 如果這些不匹配,請更改您傳遞給requests的參數(但要注意multipart/*請求,它使用記錄在Content-Type標頭中的生成邊界;將其生成留給requests )。
  • Connection :把這個留給客戶端來管理
  • Cookies :這些通常在初始 GET 請求時設置,或在首次登錄站點后設置。 確保您使用requests.Session()對象捕獲 cookie 並且您已登錄(以與瀏覽器相同的方式提供憑據)。

其他一切都是公平的游戲,但如果requests設置了默認值,那么這些默認值通常不是問題。 也就是說,我通常從 User-Agent 標頭開始,然后從那里開始。

在這種情況下,該站點正在對用戶代理進行過濾,看起來他們將Python列入黑名單,將其設置為幾乎任何其他值已經有效:

>>> requests.get('https://rent.591.com.tw', headers={'User-Agent': 'Custom'})
<Response [200]>

接下來,您需要考慮到requests不是 browser requests只是一個 HTTP 客戶端,瀏覽器可以做很多很多事情。 瀏覽器解析 HTML 以獲取附加資源,例如圖像、字體、樣式和腳本,也加載這些附加資源並執行腳本。 然后腳本可以更改瀏覽器顯示的內容並加載其他資源。 如果您的requests結果與您在瀏覽器中看到的不匹配,但瀏覽器發出初始請求匹配,那么您需要弄清楚瀏覽器加載了哪些其他資源,並根據需要對requests發出其他請求。 如果一切都失敗了,請使用requests-html類的項目,它允許您通過實際的無頭 Chromium 瀏覽器運行 URL。

您嘗試聯系的網站向https://rent.591.com.tw/home/search/rsList?is_new_list=1&type=1&kind=0&searchtype=1&region=1發出額外的 AJAX 請求,如果您是試圖從該站點抓取數據。

接下來,構建良好的站點將使用安全最佳實踐,例如CSRF 令牌,這要求您以正確的順序發出請求(例如,在向處理程序發送 POST 之前檢索表單的 GET 請求)並處理 cookie 或以其他方式提取服務器期望從一個請求傳遞到另一個請求的額外信息。

最后但並非最不重要的一點是,如果一個站點阻止腳本發出請求,他們可能要么試圖強制執行禁止抓取的服務條款,要么因為他們有一個 API,他們寧願讓你使用。 檢查其中任何一個,並考慮到如果您繼續抓取網站,您可能會更有效地被阻止。

就我而言,這是由於最近更改了網站地址,並且向我提供了舊網站地址。 至少這將狀態代碼從 404 更改為 500,我認為這是進步:)

需要注意的一件事:我正在使用requests.get()對我從文件中讀取的鏈接進行一些網絡抓取。 我沒有意識到的是,當我從文件中讀取每一行時,鏈接有一個換行符 ( \\n )。

如果您從文件中獲取多個鏈接而不是像字符串這樣的 Python 數據類型,請確保在調用requests.get("your link")之前去除任何\\r\\n字符。 就我而言,我使用了

with open("filepath", 'w') as file:
   links = file.read().splitlines()
   for link in links:
      response = requests.get(link)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM