2016-08-01 3 views
1

私はJavascriptを介してデータを生成するサイトをいくつかウェブで削り取ろうとしています。私はこれらをこすりする方法があることを今では知るためにここに十分な読み取りを行ってきた:Requestsで適切にXHRリクエストを構築する[python]

  1. あなたが要求
  2. がXHRリクエストを分離して再作成しますときに何が起こるかについてのFirebugでネットワーク]タブを見ますそれらはスクリプト内にあります。

私は1を行うときに、POSTリクエストは、このスクリーンショットでは見えリンクに送信されます enter image description here 、あなたもそれを取得応答を見ることができます。上手く見えますか?

しかし、私は試してみて、その要求&応答を再現し、私はそうのようなPythonで、Firebugのでポストタブの下に表示さペイロードで:

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

関連する問題