Получить страницу с Scrapy, выполнить JS и извлечь переменную - PullRequest
0 голосов
/ 01 октября 2019

У меня есть проект, использующий среду очистки экрана python scrapy. Я создал паука, который загружает все теги <script> и обрабатывает второй. Это связано с тем, что в собранных мной тестовых данных необходимые данные были во втором теге <script>.

Но теперь у меня проблема, в то время как некоторые страницы содержат данные, которые я хочу, в некоторых других тегах скрипта (# 3 или # 4). Еще одно препятствие заключается в том, что в основном во второй строке второго тега javascript есть нужный JSON. Но в зависимости от страницы это также может быть 3-я или 4-я строка.

Рассмотрим этот простой HTML-файл:

<html>
    <head>
        <title> Test </title>
    </head>

    <body>
        <p>
            This is a text
        </p>

        <script type="text/javascript">
            var myJSON = {
                a: "a",
                b: 42
            }
        </script>
    </body>
</html>

Я могу получить доступ к myJSON.b и получить 42, еслиЯ открываю эту страницу в своем браузере (firefox) и перехожу к инструментам разработчика и console.log(myJSON.b) Так что мой вопрос: как мне извлечь переменную JavaScript или JSON из страницы scrap-fetched-page?

1 Ответ

2 голосов
/ 01 октября 2019

Ранее я сталкивался с подобной проблемой и решил ее, извлекая текст из тега сценария, используя что-то вроде (на основе вашего образца HTML-файла):

response.xpath('//script/text()')

После этого я использовал регулярное выражение для извлечения необходимых данных в формате JSON. Таким образом, используя селектор выше и ваш пример HTML, что-то похожее на:

pattern = r'i-suck-at-regular-expressions'
json_data = response.xpath('//script/text()').re_first(pattern)

Далее, вы сможете использовать библиотеку json для загрузки данных в виде pythonсловарь примерно так:

json.loads(json_data)

И должен возвращать что-то похожее на:

{"a": "a", "b": 42}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...