Веб-слом с Beautiful Soup (не захватывая всю информацию) - PullRequest
0 голосов
/ 28 мая 2018

Я несколько раз использовал пакетик с красивым супом, но это первый раз, когда в нем нет всей необходимой мне информации.Как мне получить полную веб-страницу?Мне нужно извлечь все публикации и гиперссылки на статьи.

from bs4 import BeautifulSoup
import requests

url = 'https://openreview.net/group?id=ICLR.cc/2018/Conference'
source = requests.get(url).text
soup = BeautifulSoup(source, 'html.parser')

1 Ответ

0 голосов
/ 30 мая 2018

Есть другие HTTP-запросы, которые заполняют веб-страницу.Хороший способ увидеть это с помощью инспектора, предоставленного в веб-браузере.В Chrome эти запросы отображаются на вкладке «Сеть» в инспекторе.

Запросы следующие:

Похоже, что каждый возвращает текст JSON с информацией, которую вы ищете (публикации и гиперссылки на документы), так что вы можетепросто создайте индивидуальный запрос для каждого из этих URL-адресов и получите доступ к возвращенному JSON следующим образом:

import json

source = requests.get(new_url).text

# json.loads returns a Python dictionary
data = json.loads(source)

for publication in data['notes']:
    publication_info = publication['_bibtex']
    url = publication_info.split('\nurl={')[1].split('}')[0]

Элемент, содержащий URL-адрес для каждой публикации, довольно сложно проанализировать, поскольку в нем есть символы, которые не допускаются в словаре.имена (то есть '@'), но это решение должно работать.

Обратите внимание, что я не проверял это решение, поэтому могут быть некоторые ошибки, но основная логика решения должна быть правильной.


В качестве альтернативы:

Вы можете использовать Splash , который используется для отображения страниц на основе Javascript.Вы можете довольно легко запустить Splash в Docker и просто отправлять HTTP-запросы в контейнер Splash, который будет возвращать HTML, который выглядит как веб-страница, отображаемая в веб-браузере.

Хотя это звучит слишком сложно, на самом деле это довольно сложно.довольно прост в настройке, так как вам вообще не нужно изменять образ Docker, поэтому вам не нужно предварительное знание Docker для работы.Для запуска локального сервера Splash требуется всего одна строка: docker run -p 8050:8050 -p 5023:5023 scrapinghub/splash

Затем вы просто изменяете любые существующие запросы, которые есть в вашем коде Python, вместо маршрутизации на заставку:

т.е. http://example.com/ становится
http://localhost:8050/render.html?url=http://example.com/

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