Я пытаюсь разработать простой веб-скребок. Я хочу извлечь текст без кода HTML. На самом деле я достиг этой цели, но я видел, что на некоторых страницах, где загружен JavaScript, я не добился хороших результатов.
Например, если какой-то код JavaScript добавляет текст, я не вижу его, потому что когда я звоню
response = urllib2.urlopen(request)
Я получаю оригинальный текст без добавленного (потому что JavaScript выполняется в клиенте).
Итак, я ищу несколько идей для решения этой проблемы.
python
web-scraping
python-2.x
urlopen
mocopera
источник
источник
Ответы:
РЕДАКТИРОВАТЬ 30 / Dec / 2017: этот ответ появляется в топ-результатах поиска Google, поэтому я решил обновить его. Старый ответ еще в конце.
Dryscape больше не поддерживается, и разработчики библиотеки Dryscape рекомендуют использовать только Python 2. Я обнаружил, что использование библиотеки Python Selenium с Phantom JS в качестве веб-драйвера достаточно быстрое и простое для выполнения работы.
После установки Phantom JS убедитесь, что
phantomjs
двоичный файл доступен по текущему пути:пример
Чтобы привести пример, я создал образец страницы со следующим HTML-кодом. ( ссылка ):
без JavaScript это говорит:
No javascript support
и с Javascript:Yay! Supports javascript
Выскабливание без поддержки JS:
Соскоб с поддержкой JS:
Вы также можете использовать библиотеку Python dryscrape для очистки сайтов, управляемых javascript.
Соскоб с поддержкой JS:
источник
@Expenzor
Я работаю над окнами. PhantomJS работает отлично.Мы не получаем правильных результатов, потому что любой контент, сгенерированный javascript, должен отображаться в DOM. Когда мы выбираем HTML-страницу, мы получаем исходную, не измененную Javascript, DOM.
Поэтому нам нужно визуализировать содержимое javascript перед сканированием страницы.
Поскольку селен уже упоминался много раз в этой теме (и иногда упоминалось также о его медленной скорости), я перечислю два других возможных решения.
Решение 1: Это очень хороший учебник о том, как использовать Scrapy для сканирования контента, созданного на JavaScript, и мы собираемся следовать этому.
Что нам понадобится:
Докер установлен на нашей машине. До этого момента это преимущество перед другими решениями, поскольку оно использует независимую от ОС платформу.
Установите Splash, следуя инструкциям для нашей соответствующей ОС.
Цитирование из всплеск документации:
По сути, мы будем использовать Splash для визуализации сгенерированного Javascript контента.
Запустите сервер заставки
sudo docker run -p 8050:8050 scrapinghub/splash
.Установите плагин scrapy-splash :
pip install scrapy-splash
Предполагая, что у нас уже есть проект Scrapy (если нет, давайте создадим его ), мы будем следовать руководству и обновим
settings.py
:Наконец, мы можем использовать
SplashRequest
:Решение 2: Давайте назовем этот эксперимент в настоящий момент (май 2018) ...
Это решение только для версии Python 3.6 (на данный момент).
Знаете ли вы модуль запросов (ну, кто не знает)?
Теперь у него есть маленький брат, просматривающий веб: запросы-HTML :
Установить запросы-HTML:
pipenv install requests-html
Сделайте запрос на URL страницы:
Отобразите ответ, чтобы получить сгенерированные Javascript биты:
Наконец, модуль предлагает возможности очистки .
Кроме того, мы можем попробовать хорошо документированный способ использования BeautifulSoup с
r.html
объектом, который мы только что визуализировали.источник
r.html.html
объекте.Может быть, селен может сделать это.
источник
Если вы когда-либо использовали
Requests
модуль для Python ранее, я недавно обнаружил, что разработчик создал новый модуль,Requests-HTML
который теперь также имеет возможность визуализации JavaScript.Вы также можете посетить https://html.python-requests.org/, чтобы узнать больше об этом модуле, или, если вас интересует только рендеринг JavaScript, вы можете посетить https://html.python-requests.org/?#javascript -поддержка непосредственного изучения того, как использовать модуль для рендеринга JavaScript с использованием Python.
По сути, после правильной установки
Requests-HTML
модуля в следующем примере, показанном по вышеуказанной ссылке , показано, как можно использовать этот модуль для очистки веб-сайта и рендеринга JavaScript, содержащегося на веб-сайте:Я недавно узнал об этом из видео на YouTube. Кликните сюда! смотреть видео на YouTube, которое демонстрирует, как работает модуль.
источник
Это также кажется хорошим решением, взятым из отличного поста в блоге.
источник
Похоже, к данным, которые вы действительно ищете, можно получить доступ через вторичный URL, который вызывается каким-то javascript на основной странице.
Хотя вы можете попробовать запустить javascript на сервере, чтобы справиться с этим, более простой подход может состоять в том, чтобы загрузить страницу с помощью Firefox и использовать такой инструмент, как Charles или Firebug, чтобы точно определить, что это за вторичный URL. Затем вы можете просто запросить этот URL непосредственно для данных, которые вас интересуют.
источник
Селен лучше всего подходит для очистки содержимого JS и Ajax.
Проверьте эту статью для извлечения данных из Интернета, используя Python
Затем загрузите веб-драйвер Chrome.
Легко, правда?
источник
Вы также можете выполнить JavaScript с помощью веб-драйвера.
или сохранить значение в переменной
источник
driver.title
собственностьЛично я предпочитаю использовать скрап и селен, а также докеризацию в отдельных контейнерах. Таким образом, вы можете установить как с минимальными хлопотами, так и сканировать современные веб-сайты, которые почти все содержат JavaScript в той или иной форме. Вот пример:
Используйте,
scrapy startproject
чтобы создать свой скребок и написать свой паук, скелет может быть таким простым:Настоящая магия происходит в middlewares.py. Перезаписать два метода в промежуточном программном обеспечении загрузчика,
__init__
иprocess_request
, следующим образом:Не забудьте включить эту промежуточную программу, раскомментировав следующие строки в файле settings.py:
Далее для докеризации. Создайте свой
Dockerfile
из облегченного образа (я использую Python Alpine здесь), скопируйте в него каталог вашего проекта, установите требования:И, наконец, свести все это в
docker-compose.yaml
:Беги
docker-compose up -d
. Если вы делаете это в первый раз, потребуется некоторое время, чтобы он извлек последнюю версию селен / автономный хром, а также построил ваш скребковый образ.Как только это будет сделано, вы можете проверить, что ваши контейнеры работают,
docker ps
а также убедиться, что имя контейнера селена совпадает с именем переменной среды, которую мы передали нашему контейнеру скребка (здесь это былоSELENIUM_LOCATION=samplecrawler_selenium_1
).Введите свой контейнер скребка с
docker exec -ti YOUR_CONTAINER_NAME sh
помощью команды для меняdocker exec -ti samplecrawler_my_scraper_1 sh
, перейдите в правильный каталог и запустите свой скребок с помощьюscrapy crawl my_spider
.Все это на моей странице GitHub, и вы можете получить его здесь
источник
Сочетание BeautifulSoup и Selenium работает очень хорошо для меня.
PS Вы можете найти больше условий ожидания здесь
источник
Вы захотите использовать в своем скрипте веб-драйвер urllib, запросы, beautifulSoup и selenium для разных частей страницы (и многие другие).
Иногда вы получите то, что вам нужно, только с одним из этих модулей.
Иногда вам понадобятся два, три или все эти модули.
Иногда вам нужно отключить JS в вашем браузере.
Иногда вам понадобится информация заголовка в вашем скрипте.
Ни один веб-сайт не может быть удален одним и тем же способом, и ни один веб-сайт не может быть удален одним и тем же способом навсегда без необходимости изменения вашего сканера, обычно через несколько месяцев. Но все они могут быть очищены! Там, где есть воля, есть способ наверняка.
Если в будущем вам понадобятся данные в будущем, просто соберите все, что вам нужно, и сохраните их в файлах .dat с помощью pickle.
Просто продолжайте искать, как попробовать эти модули, копировать и вставлять свои ошибки в Google.
источник
Использование PyQt5
источник
Я пытался найти ответ на этот вопрос в течение двух дней. Многие ответы направляют вас на разные вопросы. Но ответ змея выше, действительно, в точку. Это самое короткое и простое решение. Просто напоминание, что последнее слово «var» представляет имя переменной , поэтому должно использоваться как:
источник
Мне приходилось сталкиваться с этой же проблемой в некоторых моих собственных веб-проектах. Я справился с этим, используя библиотеку запросов Python для выполнения http-запроса непосредственно к API, вместо того, чтобы загружать JS.
Для этого хорошо работает библиотека запросов python, и вы можете просмотреть http-запросы, используя элемент inspect и перейдя на вкладку network.
источник