首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在使用requests.get()的python中没有对XHR请求的响应

在使用requests.get()的python中没有对XHR请求的响应
EN

Stack Overflow用户
提问于 2019-12-03 22:10:00
回答 1查看 10.2K关注 0票数 1

我想从服务器上刮掉德国民意调查数据。在这里,我寻找一条典型的街道,stra e "Judengasse“。

我一直在尝试复制。不幸的是,来自引用的链接已经不完整了,所以我无法直接将它与我的问题进行比较。由于我相当缺乏经验,我不知道到底需要什么来复制通过web接口提交的请求。

我现在不知道我的请求需要哪些属性才能工作,哪些属性可能是多余的。在Chrome的检查模式中,我发现在我的例子中,标题属性比引用的例子多。

到目前为止,我的代码(不起作用)还没有试图复制SE帖子:

代码语言:javascript
运行
复制
import requests

url = 'https://online-service2.nuernberg.de/Finder/action/getItems'
data = {
    "finder":"Wahlraumfinder",
    "strasse":"Judengasse",
    "hausnummer":"0"
    }

headers = {
           'Host': 'online-service2.nuernberg.de', 
           'Referer': 'https://online-service2.nuernberg.de/Finder/?Wahlraumfinder', 
           'Accept': '*/*', 
           'Accept-Encoding': 'gzip, deflate, br', 
           'Accept-Language': 'de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7', 
           'Connection': 'keep-alive', 
           'Content-Length': '312', 
           'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundaryeJZfrnZATOw6B5By', 
           'DNT': '1', 
           'Host': 'online-service2.nuernberg.de', 
           'Referer': 'https://online-service2.nuernberg.de/Finder/?Wahlraumfinder', 
           'Sec-Fetch-Mode': 'cors', 
           'Sec-Fetch-Site': 'same-origin', 
           'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36',
           'X-Requested-With': 'XMLHttpRequest'
           }

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

我没有得到任何回应。我将所有请求头添加到headers中。

不确定,是否需要更多的标头。

此外,我不确定url是否正确。

我希望生成以下形式的输出,以满足“Judengasse”这一具体要求:

代码语言:javascript
运行
复制
Nr 0652
Wahllokal Willstätt.-Gym., Innerer Laufer Platz 11

这相当于在搜索栏中插入"Judengasse“,按下"Suche”搜索,然后提取第一个输出框"Wahl-/Stimmbezirk“的部分。

当我查看Chrome开发模式下的XHR时:

General

代码语言:javascript
运行
复制
Request URL: https://online-service2.nuernberg.de/Finder/action/getItems
Request Method: POST
Status Code: 200 OK
Remote Address: 193.22.166.102:443
Referrer Policy: no-referrer-when-downgrade

响应头

代码语言:javascript
运行
复制
Connection: Keep-Alive
Content-Length: 1149
Content-Type: application/json;charset=UTF-8
Date: Wed, 04 Dec 2019 00:21:30 GMT
Keep-Alive: timeout=5, max=100
Server: Apache

请求头

代码语言:javascript
运行
复制
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7
Connection: keep-alive
Content-Length: 312
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx2jHYJHo3ejnKw0l
DNT: 1
Host: online-service2.nuernberg.de
Origin: https://online-service2.nuernberg.de
Referer: https://online-service2.nuernberg.de/Finder/?Wahlraumfinder
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36
X-Requested-With: XMLHttpRequest

来自数据的

代码语言:javascript
运行
复制
------WebKitFormBoundaryx2jHYJHo3ejnKw0l
Content-Disposition: form-data; name="action"

"action/getItems"
------WebKitFormBoundaryx2jHYJHo3ejnKw0l
Content-Disposition: form-data; name="data"

{"finder":"Wahlraumfinder","strasse":"Judengasse","hausnummer":"0"}
------WebKitFormBoundaryx2jHYJHo3ejnKw0l--

感谢您的阅读。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-04 01:19:18

经过一些研究,我终于从这个服务器上得到了200条响应。

首先,在这种情况下,requests.get应该被requests.post取代,因为您想要复制HTTP请求,这是根据您从Chrome的开发模式"General“部分获得的信息。

其次,从标头中我们可以看到数据作为“多部分/表单-数据”请求的类型发送。据我所知,这是一种用于发送文件而不是常规数据的请求类型(更多关于这种类型的请求这里)。

因此,我将通过POST请求发送的字符串转换为二进制(这是通过预先处理的b实现的),并将其传递给请求的files参数。由于某些原因,这个参数需要在一个集合(a, b)中包含一个元组{c},因此需要{(None, data)}

我还将街道名作为参数传递给data,因此操作起来更容易。

我得到了这个工作代码(我正在使用浏览器的请求):

代码语言:javascript
运行
复制
import requests

url = 'https://online-service2.nuernberg.de/Finder/action/getItems'

street = b'Judengasse'

data = b'-----------------------------15242581323522\r\n' \
       b'Content-Disposition: form-data; name=\"action\"\r\n\r\n' \
       b'\"action/getItems\"\r\n-----------------------------15242581323522\r\n' \
       b'Content-Disposition: form-data; name="data"\r\n\r\n' \
       b'{\"finder\":\"Wahlraumfinder\",\"strasse\":\"%s\",\"hausnummer\":\"0\"}\r\n' \
       b'-----------------------------15242581323522--' % street

headers = {"Host": "online-service2.nuernberg.de",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0",
            "Accept": "*/*",
            "Accept-Language": "en-US,en;q=0.5",
            "Accept-Encoding": "gzip, deflate, br",
            "X-Requested-With": "XMLHttpRequest",
            "Content-Type": "multipart/form-data; boundary=---------------------------15242581323522",
            "Content-Length": "321",
            "Origin": "https://online-service2.nuernberg.de",
            "DNT": "1",
            "Connection": "keep-alive",
            "Referer": "https://online-service2.nuernberg.de/Finder/?Wahlraumfinder",
           }


multipart_data = {(None, data,)}
response = requests.post(url, files=multipart_data, headers=headers)

print(response.text)

我得到了一个原始的回应:

代码语言:javascript
运行
复制
{"id":"8c4f7a57-1bd6-423a-8ab8-e1e40e1e3852","items":[{"zeilenbeschriftung":"Wahl-/Stimmbezirk","linkAdr":null,"mapUrl":"http://online-service.nuernberg.de/Themenstadtplan/sta_gebietsgli
ederungen.aspx?p_urlvislayer=Stimmbezirke&XKoord=4433503.05&YKoord=5480253.301&Zaehler=1&Textzusatz=Judengasse+0&z_XKoord=4433670.0&z_YKoord=5480347.0&z_Zaehler=1&z_Textzusatz=Wahllokal%
20Willst%E4tt.-Gym.%2C+Innerer+Laufer+Platz+11","items":["0652","Judengasse, Neue Gasse","Willstätt.-Gym., Innerer Laufer Platz 11","Zi. 101 ,1. OG",null]},{"zeilenbeschriftung":"Stimmkr
eis Landtagswahl","linkAdr":null,"mapUrl":"http://online-service.nuernberg.de/Themenstadtplan/sta_gebietsgliederungen.aspx?p_urlvislayer=Stimmkreis_LTW&XKoord=4433503.05&YKoord=5480253.3
01&Zaehler=1&Textzusatz=Judengasse+0&p_scale=100000","items":["501","Nürnberg-Nord"]},{"zeilenbeschriftung":"Wahlkreis Bundestagswahl","linkAdr":null,"mapUrl":"http://online-service.nuer
nberg.de/Themenstadtplan/sta_gebietsgliederungen.aspx?p_urlvislayer=Wahlkreis_BTW&XKoord=4433503.05&YKoord=5480253.301&Zaehler=1&Textzusatz=Judengasse+0&p_scale=150000","items":["244","N
ürnberg-Nord"]}],"status":200}

您可以很容易地解析它以获得您期望的结果:

代码语言:javascript
运行
复制
print(response.json()["items"][0]["items"])

耶尔丁。

代码语言:javascript
运行
复制
['0652', 'Judengasse, Neue Gasse', 'Willstätt.-Gym., Innerer Laufer Platz 11', 'Zi. 101 ,1. OG', None]

希望能帮上忙。

问候

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59166141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档