Я пытаюсь очистить средний веб-сайт. Вот мой код.
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






Как упоминает в комментарии 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.
Так типа while true: вместо for x in range(3):?
Кроме того, как мне избавиться от бесполезной тарабарщины, которая печатается до того, как печатаются названия статей?
Я не вижу никакой «бесполезной тарабарщины» в выводе здесь; можете ли вы более подробно рассказать о том, что вы видите?
DevTools listening on ws://127.0.0.1:56974/devtools/browser/c03cf376-fe23-4c62-af54-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.js (2) [0602/193134.734:INFO:CONSOLE(2)] "We're hiring! https://medium.com/jobs-at-medium/work-at-medium-959d1a85284e", source: https://cdn-client.medЯ понятия не имею, что генерирует это в вашей среде. Я не знаю, что такое «devtools», но когда я запускаю код в этом ответе из командной строки, постороннего вывода нет. Вывод, который я показываю в ответе, является единственным выводом, сгенерированным кодом.
Ну что ж! Если вы знаете, дайте мне знать!
Кстати, что утконос Барри рассказал о цикле while, как мне включить его в код?
Вы найдете несколько таких примеров в Интернете, например, medium.com/analytics-vidhya/…
[0602/213749.345:INFO:CONSOLE(0)] "The resource https://miro.medium.com/v2/resize:fit:2569/1*Pxg5mSUxMauqJj07YJmtdg.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) это ошибка/сообщение, которое я получаю
Контент, который вы ищете, гидратируется на странице через вызовы JS к некоторым конечным точкам GraphQL. Вы можете очистить эти конечные точки (сложные — вам нужно построить правильные, большие полезные нагрузки) или вы можете использовать Selenium (менее сложный).