Scrapy: извлечение JSON данных из URL-адреса, созданного с использованием дат - PullRequest
0 голосов
/ 26 мая 2020

Я прочитал много сообщений об использовании Scrapy для удаления JSON данных, но не нашел ни одного с датами в URL-адресе.

Я использую Scrapy версии 2.1.0 и пытаюсь очистить это сайт , который заполняется на основе диапазонов дат в URL. Здесь - остальная часть моего кода, который включает заголовки, которые я скопировал с сайта, который я пытаюсь очистить, но я пытаюсь использовать следующие while l oop для генерации URL-адресов:

while start_date <= end_date:
    start_date += delta
    dates_url = (str(start_date) + "&end=" + str(start_date))
    ideas_url = base_url+dates_url
    request = scrapy.Request(
        ideas_url, 
        callback=self.parse_ideas, 
        headers=self.headers
    )
    print(ideas_url)
    yield request

Затем я пытаюсь очистить, используя следующее:

def parse_ideas(self, response):
    raw_data = response.body
    data = json.loads(raw_data)
    yield {
        'Idea' : data['dates']['data']['idea']
    }

Здесь - это более полный вывод ошибки, когда я пытаюсь запустить spider и экспортировать его в CSV, но я продолжаю получать сообщение об ошибке:

File "/usr/lib/python3.7/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Это лучший подход для очистки сайта, который использует даты в своем URL-адресе для заполнения? И если да, то что я делаю неправильно с моим JSON запросом, что я не получаю никаких результатов?


Обратите внимание, если это имеет значение, в settings.py я включил и отредактировал следующее:

USER_AGENT = 'Mozilla/5.0 (X11; CrOS x86_64 12871.102.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.141 Safari/4537.36'

ROBOTSTXT_OBEY = False

COOKIES_ENABLED = False

И я добавил следующее в конце settings.py

HTTPERROR_ALLOWED_CODES = [400]
DOWNLOAD_DELAY = 2

1 Ответ

0 голосов
/ 26 мая 2020

Проблема в том, что вы пытаетесь очистить приложение JavaScript. В html написано:

<noscript>You need to enable JavaScript to run this app.</noscript>

Другая проблема заключается в том, что приложение извлекает данные из этого api , что требует авторизации. Итак, я думаю, лучше всего использовать Spla sh или Selenium, чтобы дождаться загрузки страницы и использовать html, сгенерированный ими.
Лично я в основном использую что-то очень похожее на scrapy-selenium . Также для него доступен Пакет здесь

...