python requests.get(url) 超时但在浏览器中有效 (chrome);如何为特定主机定制请求 headers?

python requests.get(url) times out but works in browser (chrome); how can I tailor the request headers for a certain host?

我正在尝试使用 python 请求模块下载文件,我的代码适用于某些 urls/hosts 但我遇到了一个不起作用的代码。

基于其他类似的问题,它可能与 User-Agent 请求 header 有关,我尝试通过添加 chrome user-agent 来补救,但连接仍然存在这个特定的 url 超时(它对其他人有效)。

我已经测试过在 chrome 浏览器中打开 url(一切正常)并检查请求 headers,但我仍然无法弄清楚为什么我的代码失败:

import requests
url = 'http://publicdata.landregistry.gov.uk/market-trend-data/house-price-index-data/Indices-2020-03.csv'
headers = {'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}

session = requests.Session()
session.headers.update(headers)
response = session.get(url, stream=True)
# !!! code fails here for this particular url !!!

with open('test.csv', "wb") as fh:
    for x in response.iter_content(chunk_size=1024):
        if x: fh.write(x)

更新2020-08-14 我已经弄清楚哪里出了问题;在代码正常工作的情况下,urls 使用 https 协议。这个 url 是 http 协议,我的代理设置没有配置为 http only https。在为请求提供 http 代理后,我的代码确实按照编写的方式工作。

您可以通过传递 timeout=None 来禁用请求的超时。这是官方文档:https://requests.readthedocs.io/en/master/user/advanced/#timeouts

您发布的代码对我有用,它保存了文件(129007 行)。可能是楼主是rate-limiting你,稍后再试看看是否可行

# count lines 
$ wc -l test.csv 
129007 test.csv

# inspect headers
$ head -n 4 test.csv
Date,Region_Name,Area_Code,Index
1968-04-01,Wales,W92000004,2.11932727
1968-04-01,Scotland,S92000003,2.108087275
1968-04-01,Northern Ireland,N92000001,3.300419757