2015-10-17 4 views
1

Я пытаюсь написать сценарий python/scrapy, чтобы получить список объявлений от https://www.donedeal.ie/search/search?section=cars&adType=forsale&source=&sort=relevance%20desc&max=30&start=0, им интересно получать URL-адреса для отдельных объявлений. Я обнаружил, что страница делает запрос XHR POST на https://www.donedeal.ie/search/api/v3/find/. Пытался написать Scrapy скрипт, чтобы попробовать мою идею:python/scrapy for dynamic content

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 dev я увидел, что такой запрос дает ответ json с идентификаторами элементов, которые я мог бы использовать для формирования собственных URL.


Я попытался Selenium подход, а также, где это дает время для страницы, чтобы загрузить динамическое содержимое, но это, похоже, не работает. Полностью потерял на этом этапе :(

+0

Вы можете рассмотреть возможность сделать запрос из браузера, используя инструмент, как 'WireShark', чтобы выяснить, что протокол HTTPS является отправка/прием, так что вы можете убедиться, что ваша 'scrapy' ничего не потеряла в своем _payload._ – boardrider

+0

Так что полезная нагрузка, которую показывают инструменты разработчика, может быть неполной? –

ответ

0

Проблема с вызовом, полезная нагрузка практически OK

Сайт, который вы хотите, чтобы очистить принимает только JSON в качестве полезной нагрузки, так что вы должны изменить FormRequest на что-то вроде этого.:

import json 
yield Request(url, method='POST', 
       body=json.dumps(payload), 
       headers={'Content-Type':'application/json'}) 

Это потому, что FormRequest для SIMULATE HTML форм (тип содержимого устанавливается в application/x-www-form-urlencoded), не вызывает JSON.

+0

oh большое спасибо! работает как шарм –

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