用于动态内容的python/scrapy

用于动态内容的python/scrapy,python,scrapy,Python,Scrapy,我正在尝试编写一个python/scrapy脚本来获取来自的广告列表,我对获取单个广告的URL很感兴趣。我发现页面正在向发出XHR POST请求。 尝试编写scrapy shell脚本来尝试我的想法: from scrapy.http import FormRequest url = 'https://www.donedeal.ie/search/api/v3/find/' payload = {'section': "cars", 'adType': "forsale", 'source':

我正在尝试编写一个python/scrapy脚本来获取来自的广告列表,我对获取单个广告的URL很感兴趣。我发现页面正在向发出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响应,我可以自己使用它来形成URL



我也尝试了Selenium方法,它给了页面加载动态内容的时间,但这似乎也不起作用。在此阶段完全丢失:(

问题在于呼叫,负载几乎正常

您想要刮取的站点只接受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调用。

问题在于调用,负载几乎正常

您想要刮取的站点只接受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调用。

我无法使用Scrapy创建工作示例

然而,我确实为您提出了另外两个解决方案

在下面的示例中,响应包含JSON数据


使用的工作示例#1-使用Python测试2.7.10


使用的工作示例#2-使用Python2.7.103.3.5进行测试


我无法用Scrapy创建一个工作示例

然而,我确实为您提出了另外两个解决方案

在下面的示例中,响应包含JSON数据


使用的工作示例#1-使用Python测试2.7.10


使用的工作示例#2-使用Python2.7.103.3.5进行测试


您可以考虑使用浏览器,如使用“代码> WiRESHARK < /代码>这样的工具来确定HTTPS正在发送/接收什么,这样您就可以验证您的<代码> Surys在其有效载荷中没有丢失任何东西。因此,DEV工具显示的有效载荷可能不完整。您可以考虑使用浏览器来进行查询。类似于
WireShark
的工具,用于确定https正在发送/接收什么,以便您可以验证您的
scrapy
的负载中没有丢失任何内容。因此,开发工具显示的负载可能不完整?
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