WebScraping — BeautifulSoup Python

Я пытаюсь очистить средний веб-сайт. Вот мой код.

import requests
from bs4 import BeautifulSoup as bs

class Publication:
    def __init__(self, publication):
        self.publication = publication
        self.headers = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36'}# mimics a browser's request
    def get_articles(self):
        "Get the articles of the user/publication which was given as input"
        publication = self.publication
        r = requests.get(f"https://{publication}.com/", headers=self.headers)
        soup = bs(r.text, 'lxml')
        elements = soup.find_all('h2')
        for x in elements:
            print(x.text)

publication = Publication('towardsdatascience')
publication.get_articles()

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

Вот вывод моего кода:

How to Rewrite and Optimize Your SQL Queries to Pandas in 5 Simple Examples
Storytelling with Charts
Simplify Your Data Preparation with These Four Lesser-Known Scikit-Learn Classes
Non-Parametric Tests for Beginners (Part 1: Rank and Sign Tests)
BigQuery Best Practices: Unleash the Full Potential of Your Data Warehouse
How to Test Your Python Code with Pytest
7 Signs You’ve Become an Advanced Sklearn User Without Even Realizing It
How Data Scientists Save Time
MLOps: What is Operational Tempo?
Finding Your Dream Master’s Program in AI
Editors
TDS Editors
Ben Huberman
Caitlin Kindig
Sign up for The Variable

Контент, который вы ищете, гидратируется на странице через вызовы JS к некоторым конечным точкам GraphQL. Вы можете очистить эти конечные точки (сложные — вам нужно построить правильные, большие полезные нагрузки) или вы можете использовать Selenium (менее сложный).

Barry the Platipus 02.06.2023 14:58
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как упоминает в комментарии Barry Platipus, нужный контент загружается через Javascript. Усложняющим фактором является то, что этот контент загружается только при прокрутке страницы, поэтому даже простое решение на основе Selenium, подобное этому, все равно будет возвращать только тот же набор результатов, что и ваш существующий код:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options


options = Options()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)


class Publication:
    def __init__(self, publication):
        self.publication = publication

    def get_articles(self):
        "Get the articles of the user/publication which was given as input"
        publication = self.publication
        driver.get(f"https://{publication}.com/")
        elements = driver.find_elements(By.CSS_SELECTOR, "h2")
        for x in elements:
            print(x.text)


publication = Publication("towardsdatascience")
publication.get_articles()

Чтобы получить больше, чем первоначальный набор статей, нам нужно прокрутить страницу. Например, если мы добавим простой цикл для прокрутки страницы несколько раз перед запросом элементов h2, например:

    def get_articles(self):
        "Get the articles of the user/publication which was given as input"
        publication = self.publication
        driver.get(f"https://{publication}.com/")
        for x in range(3):
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

            # The sleep here is to give the page time to respond.
            time.sleep(0.2)
        elements = driver.find_elements(By.CSS_SELECTOR, "h2")
        for x in elements:
            print(x.text)

Тогда вывод кода:

Large Language Models in Molecular Biology
How to Rewrite and Optimize Your SQL Queries to Pandas in 5 Simple Examples
Storytelling with Charts
Simplify Your Data Preparation with These Four Lesser-Known Scikit-Learn Classes
Non-Parametric Tests for Beginners (Part 1: Rank and Sign Tests)
BigQuery Best Practices: Unleash the Full Potential of Your Data Warehouse
How to Test Your Python Code with Pytest
7 Signs You’ve Become an Advanced Sklearn User Without Even Realizing It
How Data Scientists Save Time
MLOps: What is Operational Tempo?
Finding Your Dream Master’s Program in AI
Temporary Variables in Python: Readability versus Performance
Naive Bayes Classification
Predicting the Functionality of Water Pumps with XGBoost
Detection of Credit Card Fraud with an Autoencoder
4 Reasons Why I Won’t Sign the “Existential Risk” New Statement
The Data-centric AI Concepts in Segment Anything
3D Deep Learning Python Tutorial: PointNet Data Preparation
Why Trust and Safety in Enterprise AI Is (Relatively) Easy
The Principles of a Modern Computer Scientist

Эта страница выглядит как страница с «бесконечной прокруткой», поэтому вы, вероятно, захотите установить ограничение на количество прокруток для поиска нового контента.

Страницу можно прокручивать до тех пор, пока на нее добавляется новая информация, например, в цикле while, а затем выходить из него. +1.

Barry the Platipus 02.06.2023 15:36

Так типа while true: вместо for x in range(3):?

Karthik Bhandary 02.06.2023 15:55

Кроме того, как мне избавиться от бесполезной тарабарщины, которая печатается до того, как печатаются названия статей?

Karthik Bhandary 02.06.2023 16:02

Я не вижу никакой «бесполезной тарабарщины» в выводе здесь; можете ли вы более подробно рассказать о том, что вы видите?

larsks 02.06.2023 16:34
DevTools listening on ws://127.0.0.1:56974/devtools/browser/c03cf376-fe23-4c62-af5‌​4-35e0a0c75346 [0602/193134.733:INFO:CONSOLE(2)] " ... .,ok000Oxc. 'oxo, .' ,kWMMMMMMMMXo;. ;KMWMX: lK, ,0MMMMMMMMMMMWNd'xMMMMMO;xWl lWMMMMMMMMMMMMM0lOMMMMMKoOMo cNMMMMMMMMMMMMMk:OMMMMM0lkWl .dNMMMMMMMMMMKx; lWMMMWd.dN: ;kXWMMMMWKd' .oXWXx. ;o. .;ccc:,. .,. ", source: https://cdn-client.medium.com/lite/static/js/main.1f67da2f.j‌​s (2) [0602/193134.734:INFO:CONSOLE(2)] "We're hiring! https://medium.com/jobs-at-medium/work-at-medium-959d1a85284‌​e", source: https://cdn-client.med
Karthik Bhandary 02.06.2023 16:52

Я понятия не имею, что генерирует это в вашей среде. Я не знаю, что такое «devtools», но когда я запускаю код в этом ответе из командной строки, постороннего вывода нет. Вывод, который я показываю в ответе, является единственным выводом, сгенерированным кодом.

larsks 02.06.2023 16:56

Ну что ж! Если вы знаете, дайте мне знать!

Karthik Bhandary 02.06.2023 17:12

Кстати, что утконос Барри рассказал о цикле while, как мне включить его в код?

Karthik Bhandary 02.06.2023 17:13

Вы найдете несколько таких примеров в Интернете, например, medium.com/analytics-vidhya/…

larsks 02.06.2023 17:51
[0602/213749.345:INFO:CONSOLE(0)] "The resource https://miro.medium.com/v2/resize:fit:2569/1*Pxg5mSUxMauqJj0‌​7YJmtdg.png was preloaded using link preload but not used within a few seconds from the window's load event. Please make sure it has an appropriate 'as' value and it is preloaded intentionally.", source: https://towardsdatascience.com/ (0) это ошибка/сообщение, которое я получаю
Karthik Bhandary 02.06.2023 18:08

Другие вопросы по теме