Как очистить веб-сайт javascript в Python?

Sep 06 2020

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

URL: "https://www.todayonline.com/"

Это два метода, которые я пробовал, но потерпел неудачу.

Метод 1: красивый суп

tdy_url = "https://www.todayonline.com/"
page = requests.get(tdy_url).text
soup = BeautifulSoup(page)
soup  # Returns me a HTML with javascript text
soup.find_all('h3')

### Returns me empty list []

Метод 2: Selenium + BeautifulSoup

tdy_url = "https://www.todayonline.com/"

options = Options()
options.headless = True

driver = webdriver.Chrome("chromedriver",options=options)

driver.get(tdy_url)
time.sleep(10)
html = driver.page_source

soup = BeautifulSoup(html)
soup.find_all('h3')

### Returns me only less than 1/4 of the 'h3' tags found in the original page source 

Пожалуйста помоги. Я пробовал сканировать другие новостные сайты, и это намного проще. Спасибо.

Ответы

2 politicalscientist Sep 06 2020 at 15:38

Вы можете получить доступ к данным через API (перейдите на вкладку Сеть):


Например,

import requests
url = "https://www.todayonline.com/api/v3/news_feed/7"
data = requests.get(url).json()
2 Noname Sep 06 2020 at 15:39

Существуют разные способы сбора содержимого веб-страницы, содержащей Javascript.

  1. Использование seleniumс веб-драйвером Firefox
  2. Использование безголового браузера с phantomJS
  3. Выполнение вызова API с использованием клиента REST или requestsбиблиотеки Python

Вы должны сначала провести исследование

2 MananGajjar Sep 06 2020 at 16:04

Я предлагаю вам довольно простой подход,

import requests
from bs4 import BeautifulSoup as bs

page = requests.get('https://www.todayonline.com/googlenews.xml').content
soup = bs(page)
news = [i.text for i in soup.find_all('news:title')]

print(news)

вывод

['DBS named world’s best bank by New York-based financial publication',
 'Russia has very serious questions to answer on Navalny - UK',
 "Exclusive: 90% of China's Sinovac employees, families took coronavirus vaccine - CEO",
 'Three militants killed after fatal attack on policeman in Tunisia',
.....]

Кроме того, при необходимости вы можете проверить страницу XML для получения дополнительной информации.

PS Всегда проверяйте соответствие перед тем, как убирать любой сайт :)

2 DemianWolf Sep 06 2020 at 16:00

Данные новостей на веб-сайте, который вы пытаетесь очистить, извлекаются с сервера с помощью JavaScript (это называется XHR - XMLHttpRequest ). Это происходит динамически, пока страница загружается или прокручивается. поэтому эти данные не возвращаются внутри страницы, возвращаемой сервером.

В первом примере вы получаете только страницу, возвращаемую сервером - без новостей, но с JS, который должен их получать. Ни запросы, ни BeautifulSoup не могут выполнять JS.

Однако вы можете попытаться воспроизвести запросы, которые получают заголовки новостей с сервера, с помощью запросов Python. Проделайте следующие шаги:

  1. Откройте DevTools в своем браузере (обычно для этого нужно нажать F12или Ctrl+ Shit+ I) и просмотрите запросы, которые получают заголовки новостей с сервера. Иногда это даже проще, чем очистка веб-страниц с помощью BeautifulSoup. Вот скриншот (Firefox):
  1. Скопируйте ссылку запроса (щелкните правой кнопкой мыши -> Копировать -> Копировать ссылку) и передайте ее requests.get(...).

  2. Получите .json()запрос. Он вернет диктовку, с которой легко работать. Чтобы лучше понять структуру dict, я бы рекомендовал использовать pprintвместо простого print. Обратите внимание, что вам нужно сделать это from pprint import pprintперед использованием.

Вот пример кода, который получает заголовки из основных новостей на странице:

import requests


nodes = requests.get("https://www.todayonline.com/api/v3/news_feed/7")\
        .json()["nodes"]
for node in nodes:
    print(node["node"]["title"])

Если вы хотите очистить группу новостей под заголовком, вам нужно изменить число после news_feed/в URL-адресе запроса (чтобы получить его, вам просто нужно отфильтровать запросы по «news_feed» в DevTools и прокрутить страницу новостей вниз).

Иногда веб-сайты имеют защиту от ботов (хотя веб-сайт, который вы пытаетесь очистить, нет). В таких случаях вам может потребоваться выполнить эти действия .