2016-08-01 501 views
1

我想要做一些网站通过Javascript生成它的数据的网站。我已经通过,现在刮的这些方法是做了足够的阅读就在这里要知道:用请求正确地构造一个XHR请求[python]

  1. 观看萤火虫网络选项卡当您
  2. 隔离XHR请求,并重新请求会发生什么他们在一个脚本。

所以,当我做1,POST请求被发送到在这张截图中可见的链接: enter image description here ,你也可以看到它得到响应。看起来不错,对吧?

但是当我尝试并重新创建请求&响应,有效载荷,我在Firebug后标签下看到,在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) 

我得到的显示错误消息的页面: Request format is unrecognized for URL unexpectedly ending in \'/MemberSearch\'

所以,我的问题是 - 为什么我在Firebug中的响应正常工作时得到该响应?我在Python脚本中的requests.post(url)行中错过了什么吗?

回答

1

您需要将字典转储为JSON并作为有效负载发送。设置Content-Type请求标头也很重要:

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) 
+0

非常感谢,@alecxe! – n1c9