我正在尝试对一个网站进行一些网络抓取,通过 JavaScript 生成其数据。我已经在这里阅读了足够多的内容,现在知道抓取这些内容的方法是:
- 观察 Firebug 中的网络选项卡,了解发出请求时会发生什么
- 隔离 XHR 请求并在脚本中重新创建它们。
因此,当我执行 1 时,POST 请求将发送到此屏幕截图中可见的链接: 您还可以看到它得到的响应。看起来很棒,对吧?
但是当我尝试重新创建该请求和响应时,使用我在 Firebug 的 Post 选项卡下看到的有效负载,在 Python 中如下所示:
import requests
from bs4 import BeautifulSoup
payload = {"Max":999,"RectCoord":"89,-179,-89,179","Source":"","SortField":"NEWID()","OfficeName":"","FirstName"
:"","LastName":"da","CityName":"","ZipCode":"","Category":"S","SecLanguageReq":"","OfficeCode":""}
r = requests.post('http://search.cnyrealtor.com/MyAjaxService.asmx/MemberSearch', data=payload)
print(r.content)
我收到一个显示错误消息的页面:
无法识别意外以\'/MemberSearch\' 结尾的 URL 的请求格式
所以,我的问题是 - 当 Firebug 中的响应工作正常时,为什么我会收到该响应?我在 Python 脚本中的 requests.post(url)
行中是否遗漏了某些内容?
最佳答案
您需要将字典转储为 JSON 并作为有效负载发送。设置 Content-Type
请求 header 也很重要:
import json
import requests
payload = {"Max": 999, "RectCoord": "89,-179,-89,179", "Source": "", "SortField": "NEWID()", "OfficeName": "",
"FirstName": "", "LastName": "", "CityName": "", "ZipCode": "", "Category": "S", "SecLanguageReq": "",
"OfficeCode": ""}
with requests.Session() as session:
session.get("http://search.cnyrealtor.com/SiteContent/SYR/MemberSearchSYR.aspx")
r = session.post('http://search.cnyrealtor.com/MyAjaxService.asmx/MemberSearch', data=json.dumps(payload),
headers={"Content-Type": "application/json; charset=UTF-8"})
print(r.content)
关于javascript - 使用 Requests 正确构建 XHR 请求 [python],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38704592/