使用request.get()

时间:2019-12-03 22:10:00

标签: ajax python-3.x python-requests xmlhttprequest

我想从服务器上抓取german poll data。在这里,我搜索了一条名为“ Judengasse”的示例街。

我一直在尝试复制this。不幸的是,参考文献中的链接不再完整,因此我无法直接将其与我的问题进行比较。由于我经验不足,因此我不知道重现通过Web界面提交的请求的确切条件。

我现在不需要我的请求才能使用标头的哪些属性,它可能是多余的。在Chrome的检查模式下,我发现比起引用的示例,标题属性更多。

到目前为止,我的代码(无法正常工作)没有尝试重现SE帖子:

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”生成以下形式的输出:

Nr 0652
Wahllokal Willstätt.-Gym., Innerer Laufer Platz 11

这相当于将“ Judengasse”放入搜索栏,然后继续 搜索“搜索”并提取第一个输出框“ Wahl- / Stimmbezirk”的一部分

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

常规

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

响应标题

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

请求标头

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

来自数据

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

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

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

感谢您阅读。

1 个答案:

答案 0 :(得分:0)

经过一番研究,我终于设法从该服务器获得了200条响应。

首先,在这种情况下,requests.get应该替换为requests.post,因为您要根据从Chrome开发模式的“常规”部分获得的信息来复制HTTP POST请求。 / p>

第二,从标头中我们可以看到数据以“ multipart / form-data”类型的请求发送。据我了解,这是一种用于发送文件而不是常规数据的请求(有关这种请求here的更多信息)。

因此,我将通过POST请求发送的字符串转换为二进制(这是通过在b前面添加)并将其传递给请求的files参数。由于某种原因,此参数要求在集合(a, b)中有一个元组{c},因此在{(None, data)}中也是如此。

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

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

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)

我得到了这个原始答复:

{"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}

您可以轻松地对其进行解析以获得期望的结果:

print(response.json()["items"][0]["items"])

屈服...

['0652', 'Judengasse, Neue Gasse', 'Willstätt.-Gym., Innerer Laufer Platz 11', 'Zi. 101 ,1. OG', None]

希望有帮助。

致谢