我正在尝试编写一个python / scrapy脚本来获取https://www.donedeal.ie/search/search?section=cars&adType=forsale&source=&sort=relevance%20desc&max=30&start=0的广告列表,我有兴趣获取各个广告的网址。我发现该页面正在向https://www.donedeal.ie/search/api/v3/find/发出XHR POST请求。 试图编写scrapy shell脚本来尝试我的想法:
from scrapy.http import FormRequest
url = 'https://www.donedeal.ie/search/api/v3/find/'
payload = {'section': "cars", 'adType': "forsale", 'source': "", 'sort': "relevance desc", 'area': '', 'max': '30', 'start':'0'}
req = FormRequest(url, formdata=payload)
fetch(req)
但我没有回应。在Chrome开发工具中,我看到这样的请求给出了带有项ID的json响应,我可以用它来自己形成网址。
我也试过了Selenium方法,它为页面加载动态内容留出了时间,但似乎也没有用。在这个阶段完全失败:(
答案 0 :(得分:0)
问题在于呼叫,有效载荷几乎没问题。
您要抓取的网站仅接受JSON作为有效负载,因此您应将FormRequest
更改为以下内容:
import json
yield Request( url, method='POST',
body=json.dumps(payload),
headers={'Content-Type':'application/json'} )
这是因为FormRequest
用于模拟HTML表单(内容类型设置为application/x-www-form-urlencoded
),而不是JSON调用。
答案 1 :(得分:0)
我无法使用Scrapy创建一个工作示例。
但是,我确实为您提出了另外两种解决方案。
在下面的示例中,响应包含JSON数据。
工作示例#1 使用 urllib2
- 使用Python 2.7.10 进行测试强>
import urllib2
url = 'https://www.donedeal.ie/search/api/v3/find/'
payload = '{"section":"cars","adType":"forsale","source":"","sort":"relevance desc","max":30,"start":0,"area":[]}'
req = urllib2.Request(url)
req.add_header('Content-Type', 'application/json')
response = urllib2.urlopen(req, payload).read()
工作示例#2 ,使用 requests
- 使用Python 2.7.10 进行测试和 3.3.5 和 3.5.0
import requests
url = 'https://www.donedeal.ie/search/api/v3/find/'
payload = '{"section":"cars","adType":"forsale","source":"","sort":"relevance desc","max":30,"start":0,"area":[]}'
response = requests.post(url, json=payload).content