Python的“requests”库发送HTTP请求时返回404状态码,但在浏览器中页面可以正常加载。

7
我正在尝试爬取几个网站的内容。但是我注意到,对于一些网站,我得到的响应状态码是200。然而,对于其他一些网站,我得到的响应是404状态码。但是当我在浏览器中打开这些网站时,它们可以正常加载。我错过了什么吗?
例如:
import requests

url_1 = "https://www.transfermarkt.com/jumplist/startseite/wettbewerb/GB1"
url_2 = "https://dev59.com/LVoV5IYBdhLWcg3wPctv"

page_t = requests.get(url_2)
print(page_t.status_code)      #Getting a Not Found page and  404 status

page = requests.get(url_1)
print(page.status_code)       #Getting a Valid HTML page and 200 status

2
也许该网站会检查请求是否真实,并向网络爬虫发送404响应! - csabinho
1
确实如此! - Paul Vannan
3个回答

9
你提到的网站正在检查请求头中的"User-Agent"。您可以通过在requests.get(..)调用中传递包含自定义标头dict对象来伪造请求中的"User-Agent"。这将使其看起来像是来自实际浏览器,并且您将收到响应。
例如:
>>> import requests
>>> url = "https://www.transfermarkt.com/jumplist/startseite/wettbewerb/GB1"
>>> headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'}

# Make request with "User-Agent" Header
>>> response = requests.get(url, headers=headers)
>>> response.status_code
200   # success response

>>> response.text  # will return the website content

5

有些网站不允许爬取数据。因此,您需要提供一个带有用户代理的标头,指定浏览器类型和系统,以便说明这是一个浏览器请求而不是一些试图爬取数据的代码。

在您的代码中使用以下内容:

headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}

response = requests.get(url, headers=headers)`

看看这个能否帮助解决问题


你的回答有效!如果网站试图阻止请求,那么抓取数据是否非法? - Paul Vannan
当然不是。他们只是试图降低服务器负载,可能防止人们窃取可用于商业用途的数据。只要您不过度使用服务器并且不将数据用于商业用途,他们甚至不会意识到! - csabinho
简单来说,您不会让一个脚本运行就把您花费大量时间积累的大量数据公开给他人,而没有任何客户保留或好处。@PaulVannan - Nishant Nischal Chintalapati

1
正如 @csabinho 所说,该网站可能正在检查是否为真实的(人类)请求。因此,您需要添加标头以向网站显示它不是 Python 脚本。
hdr = {'User-Agent': 'Mozilla/5.0'}
page_t = requests.get(url_t, headers=hdr)
print(page_t.status_code)
# got 200 code for this

您的用户代理可能太短和简单了! - csabinho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接