簡體   English   中英

HTTP 錯誤 400:錯誤請求 (urllib)

[英]HTTP Error 400: Bad Request (urllib)

我正在編寫一個腳本來獲取有關紐約市建築物的信息。 我知道我的代碼可以工作並返回我想要的。 我以前在做手動輸入,它奏效了。 現在我試圖讓它從文本文件中讀取地址並使用該信息訪問網站,但出現此錯誤:

urllib.error.HTTPError: HTTP 錯誤 400: 錯誤請求

我相信這與網站不喜歡從不是瀏覽器的東西進行大量訪問有關。 我聽說過一些關於用戶代理的事情,但不知道如何使用它們。 這是我的代碼:

from bs4 import BeautifulSoup
import urllib.request

f = open("FILE PATH GOES HERE")

def getBuilding(link):
    r = urllib.request.urlopen(link).read()
    soup = BeautifulSoup(r, "html.parser")
    print(soup.find("b",text="KEYWORDS IM SEARCHING FOR GO HERE:").find_next("td").text)


def main():
    for line in f:
        num, name = line.split(" ", 1)
        newName = name.replace(" ", "+")
        link = "LINK GOES HERE (constructed from num and newName variables)"
        getBuilding(link)      
    f.close()

if __name__ == "__main__":
    main()

400 錯誤意味着服務器無法理解您的請求(例如,格式錯誤的語法)。 也就是說,由開發人員決定他們想要返回什么狀態代碼,不幸的是,並非每個人都嚴格遵循其預期含義。

查看此頁面以了解有關 HTTP 狀態代碼的更多詳細信息。

關於如何設置用戶代理:用戶代理設置在請求頭中,基本上定義了發出請求的客戶端。 這是公認的用戶代理列表。 您將需要使用urllib2而不是urllib ,但urllib2也是一個內置包。 我將向您展示如何更新getBuilding函數以使用該模塊設置標頭。 但我建議查看請求庫。 我只是發現這非常簡單,並且得到了高度的采用/支持。

蟒蛇2:

from urllib2 import Request, urlopen

def getBuilding(link):        
    q = Request(link)
    q.add_header('User-Agent', 'Mozilla/5.0')
    r = urlopen(q).read()
    soup = BeautifulSoup(r, "html.parser")
    print(soup.find("b",text="KEYWORDS IM SEARCHING FOR GO HERE:").find_next("td").text)

蟒蛇3:

from urllib.request import Request, urlopen

def getBuilding(link):        
    q = Request(link)
    q.add_header('User-Agent', 'Mozilla/5.0')
    r = urlopen(q).read()
    soup = BeautifulSoup(r, "html.parser")
    print(soup.find("b",text="KEYWORDS IM SEARCHING FOR GO HERE:").find_next("td").text)

注意:Python v2 和 v3 之間的唯一區別是 import 語句。

暫無
暫無

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

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