python / scrapy用于动态内容

时间:2015-10-17 10:43:14

标签: python scrapy

我正在尝试编写一个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方法,它为页面加载动态内容留出了时间,但似乎也没有用。在这个阶段完全失败:(

2 个答案:

答案 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