Извличане на данни от уеб с BeautifulSoup и Selenium: пълно ръководство

  • BeautifulSoup и Requests са идеални за статично извличане на HTML код, който вече е рендиран от сървъра.
  • Selenium ви позволява да зареждате JavaScript, да обработвате iframe-ове и да симулирате потребителски действия на динамични страници.
  • Комбинирането на Selenium за рендиране и BeautifulSoup за парсинг осигурява гъвкавост и прецизност.
  • Етиката, уважението към robots.txt и доброто управление на грешките са ключови във всеки проект за извличане на информация.

Извличане на данни от уеб с BeautifulSoup и Selenium

Когато шефът ви те пита следете цените на конкурентите, анализирайте отзиви или събирайте данни от стотици странициРъчното копиране и поставяне вече не е опция. Нуждаете се от начин да автоматизирате извличането на информация, без да се подлудявате или да губите часове в повтарящи се задачи.

В екосистемата на Python, двата инструмента, за които ще чувате най-много за това, са Красива супа и селенЕдиният се справя отлично с бързия и лесен анализ на HTML; другият може да отвори истински браузър, да изпълни JavaScript, да кликва, да попълва формуляри и да се държи като човек. Ключът е да го разбирате добре. кога да използвате всеки от тях и как да ги комбинирате за да извлечете максимума от тях.

Какво е уеб скрейпинг и кога има смисъл да се използва

Извличането на данни от мрежата не е нищо повече от процес на извличане на данни от уеб странициМожете да го направите чрез копиране и поставяне, но с нарастването на количеството информация, има смисъл да разчитате на скриптове или автоматизирани инструменти, които преглеждат страниците и запазват това, което ви интересува.

С остъргване можете Съставяне на продуктови обяви и цени, новини, отзиви, коментари и публикации в социалните медии или почти всяко съдържание, което е публично достъпно в мрежата. По същество това е предварителната стъпка за много проекти за анализ на данни, машинно обучение или автоматизация на задачи.

Важно е обаче да сте наясно кога извличането на данни трябва да бъде вашата стратегия. последна инстанция, не първатаАко сайтът вече предлага добре документиран официален API, обикновено е по-добре да го използвате: той е по-стабилен, обикновено има ясни ограничения за използване и намалява риска от нарушаване на каквото и да е или нарушаване на условията за ползване.

Остъргването започва да има смисъл, когато Няма API, API е непълен или имате нужда от данни, които се показват само в уеб интерфейса., като например вградени коментари, класации, малки тагове или динамично генерирани блокове със съдържание.

Важно е също да се прави разлика между две понятия, които често се бъркат: уеб скрейпинг и уеб обхожданеСкрейпингът се фокусира върху извличането на специфични данни от конкретни страници; обхождането, от друга страна, е посветено на да изследвате и картографирате структурата на даден сайт или на цялата мрежакато следвате връзки, точно както търсачките индексират съдържание.

Правни и етични аспекти: какво не бива да пренебрегвате

Преди да пуснете скрепера си безразсъдно, си струва да отделите малко време, за да помислите за... правни, технически и етични последициИзвличането на информация от собствен уебсайт или академичен проект не е същото като създаването на търговска услуга, базирана на данни на други хора.

Първото нещо, което трябва да проверите, е дали сте спазване на законодателството на вашата държава или регионВъпроси като защита на данните, поверителност и използване на лична информация могат да варират значително от едно място на друго, така че не е добра идея да ги игнорирате. Ако ще работите с чувствителни или идентифицируеми данни, най-добре е да се консултирате с някой, който е запознат с технологичното право.

Следващата стъпка е да проверите дали сайтът има условия за ползване, които забраняват извличането на данни от съдържаниетоМного портали включват специфични клаузи в своите Общи условия относно автоматизираното извличане на данни, търговското използване на информация или неоторизиран достъп до определени раздели.

Има една ключова част, която почти винаги трябва да разгледате: файлът robots.txtЩе го намерите в корена на домейна, нещо подобно https://www.ejemplo.com/robots.txtТам собственикът посочва кои маршрути не иска да бъдат обхождани или индексирани, например чрез директиви като Забрани да блокират маршрути или Забавяне при обхождане за да се осигури минимално забавяне между заявките.

Спазването на тези насоки не е само въпрос на етика, но и начин за Не претоварвайте сървъра със стотици заявки в секунда.Лошо проектираният скрепер може да наподобява атака тип „отказ от услуга“ и това, освен че е неелегантно, може да ви причини проблеми.

Накрая, запитайте се дали Използването, което възнамерявате да използвате с данните, е разумно.Ще ги разпространявате ли такива, каквито са? Ще ги смесвате ли с други източници? Дали е за вътрешен проект или за препродажба на информация? Тези въпроси силно влияят върху рисковете и как трябва да проектирате решението си.

Как всъщност се зарежда уеб страница: HTML, CSS, JavaScript и iframes

За да се извършва ефективно извличане на данни от скрипта, е важно да се разбере какво всъщност вижда вашият скрипт, когато отправя заявка. В идеалния случай страницата, получена от сървъра, вече би включвала целия HTML код със съдържанието, което ви интересуваИ всичко, което браузърът би направил, е да го стилизира с CSS и да добави малко интерактивност с JavaScript.

Реалността е по-неприятна: много съвременни уебсайтове Те зареждат данни отложено с помощта на JavaScript и вграждат съдържание на трети страни с iframe-ове. или пренаписват DOM в движение. Ако отворите класическото меню „Преглед на изходния код“ на браузъра, понякога няма да видите никакви следи от коментарите, броячите или динамичните блокове, които се появяват на екрана.

Типичен пример са системи за коментиране като DisqusОригиналният HTML код може да не съдържа нито един ред коментари, но крайният DOM код, генериран от браузъра, може да съдържа такъв. iframe, създаден от JavaScript където се зарежда цялата нишка. Ако се опитате да направите статично извличане на тази страница, ще получите „окаменен“ HTML код.

В тези типове сценарии стратегията включва симулира какво прави истинският браузърЗаредете страницата, оставете JavaScript да работи, изчакайте да се появят елементите, които ви интересуват, и едва след това извлечете съдържанието. Тук се намесва Selenium.

Статично извличане на данни с Requests и BeautifulSoup

Когато съдържанието, от което се нуждаете, вече е в първоначалния HTML код (типичен продукт, новини, прости таблици, статични списъци), най-ефективният подход обикновено е да използвате Заявки за отправяне на HTTP заявка и BeautifulSoup за парсиране на HTMLТова е класическата двойка за леко и бързо остъргване.

Основният процес е прост: първо изпращате заявка с requests.get(url) и анализирате отговора. Предмет в ръка, можете да погледнете кодът на състоянието със status_code, текстовото съдържание с text или двоичното съдържание със content, в допълнение към проверката на заглавките и крайните URL адреси, за да се разбере по-добре какво връща сървърът.

След като имате HTML кода, го предавате на BeautifulSoup, обикновено с нещо подобно: BeautifulSoup(html, "html.parser")Парсерът разделя текста на дървовидна структура, която е много по-удобна за търсене на тагове, атрибути и вложено съдържание.

С този обект soup вече можете да използвате методи като намиране, намиране_на_всички или избиране за локализиране на конкретни възли: например, всички които съдържат уроци, редовете на таблица, връзките в секция с новини или всяка част от страницата, която има сравнително съгласувана HTML структура.

Типичен пример е създаването на скрепер за дигитален вестник като Página 12. Можете да направите заявка към началната страница, анализирайте блоковете на секциите, намерете връзките към новините И оттам систематично да навигирате, за да ви покаже заглавия, дати, основен текст, основни изображения и всякакви данни, които ви интересуват, като ги опаковате в речници, готови за запазване в база данни.

В тези скрепери е препоръчително да се добави логика към обработка на грешки с try-except За да се предотврати евентуално спиране на целия процес от един-единствен неуспех (новина с променена структура, неуспешна заявка, липсващ етикет), ежедневната рутина за тези типове проекти е да се отбележат специфични изключения и да се реши кога да се игнорират грешките и кога да се спре.

Динамично извличане на данни със Selenium: JavaScript, iframe-ове и потребителски действия

Когато мрежата започне да разчита на JavaScript за абсолютно всичко, статичното извличане на данни се оказва недостатъчно. Ако съдържанието се генерира в движение, то се крие зад... iframe или се появява само след взаимодействие с бутони, формуляри или динамични елементиНуждаете се от истински браузър или браузър без графичен интерфейс, който изпълнява цялата тази логика.

Тук Селенът показва мускулите си. Първоначално Селенът е бил проектиран да... Автоматизирайте функционалното тестване на уеб приложенияНо способността му да се справя с браузър – отваряне на страници, кликване, попълване на полета, чакане за зареждане на съдържание – го прави много мощен инструмент за динамично извличане на данни.

Сърцето на Selenium е WebDriver, компонент, който контролира избрания браузър (Chrome, Firefox и други). За да го използвате, ви е необходим драйвер, специфичен за браузъра (geckodriver за Firefox, chromedriver за Chrome и др.), който трябва да е в път, достъпен от вашата система, обикновено включен в променливата на средата PATH.

Основната инсталация на Python се извършва с нещо подобно pip инсталира селенОттам, във вашия скрипт създавате екземпляр на WebDriver, например с webdriver.Firefox() или webdriver.Chrome()И сега можете да започнете да разглеждате, да отваряте URL адреси или да взаимодействате със страницата, сякаш сте истински потребител.

Що се отнася до вида на браузъра, можете да използвате пълнофункционален браузър с графичен интерфейс или браузър в режим на готовност. без главаНа теория има алтернативи като PhantomJS, но на практика много хора съобщават за несъвместимости и странно поведение, така че обикновено е за предпочитане да се използва... използвайте Chrome или Firefox в реален или безконтактен режим за да се намалят изненадите.

След като страницата се зареди, Selenium ви позволява да локализирате елементи, използвайки голямо разнообразие от селектори: по идентификатор, име, клас, CSS селектор или XPathМожете да извикате методи като намиране_елемент или намиране_елементи и оттам да стартирате действия като щракване, изпращане на клавиши или извличане на видимия текст на всеки възел.

Комбинирайте Selenium и BeautifulSoup, за да извлечете максимума от това

Най-мощната комбинация за сложни сайтове обикновено е следната: Selenium се грижи за зареждането на страницата, изпълнението на JavaScript и подготовката на финалния DOM; BeautifulSoup след това се намесва, за да анализира рендерирания HTML и да извлича данните. с цялото удобство на функциите за търсене.

Общият модел е прост. Първо, инициализирате WebDriver-а, след което зареждате URL адреса с драйвер.get() И, ако е необходимо, изчаквате да се появят определени ключови елементи, използвайки изрични чакания. Когато сте сигурни, че съдържанието се е заредило, получавате Краен HTML код с driver.page_source.

Предавате този HTML код на BeautifulSoup, точно както бихте направили при статично извличане, за да итерирате таблици, списъци, статии, редове или всеки блок с повтаряща се структураТова ви позволява да използвате силата на селекторите на Selenium, за да достигнете до правилната част на страницата, а след това и гъвкавостта на BeautifulSoup за чисто извличане на данни.

На страници, които използват iframes, като например коментари в Disqus, често се налага промяна на контекста към конкретната iframe преди извличане на съдържание. Със Selenium можете да локализирате iframe-а - например този, който виси от контейнера с id disqus_thread -, да използвате switch_to.frame и, след като сте вътре, да изчакате да се заредят елементи като брояча на коментарите или текстовите блокове.

В други случаи, като например генераторите на съдържание, комбинацията е още по-очевидна. Представете си генератор на имена от „Междузвездни войни“, който ви позволява да избирате Ако искате мъжки, женски или смесени имена и колко искате наведнъжНапример, 100 имена на клик. Selenium се грижи за избора на подходящата опция (например, радио бутона с име="избор" и стойност="100"), щракването върху бутона „Генериране“ и изчакването на таблицата с имена да бъде изградена.

След като се появи таблицата с имена, извличате driver.page_source, го предавате на BeautifulSoupТърсите съответната таблица (например четвъртата таблица на страницата) и извличате всички клетки от нея. Почиствате текста, като замествате необичайни символи, премахвате дубликати и запазвате всяко ново име в списък.

В цикъл, който повтаря този процес, докато например се достигнат 100 000 имена, Selenium автоматизира взаимодействието с потребителския интерфейс, а BeautifulSoup се занимава с извличането и почистването на данни. Не е необичайно такъв процес да отнеме известно време. повече от часСледователно е препоръчително да се контролират времената, да се обработват изключения и, ако е необходимо, да се запазват междинни състояния, за да се избегне загуба на работа.

Практически случаи на употреба с BeautifulSoup, Selenium и API

С всички тези части на масата можете да изградите доста разнообразни проекти, вариращи от От прости скрепери за лична употреба до сложни тръбопроводи за добив на големи количестваВажното е да изберете правилния инструмент за всеки слой.

В областта на издателската дейност, например, можете да настроите система, която обхожда уебсайта на вестник, получава За статии в определен раздел изтеглете основния текст, автора, датата, етикетите и основното изображение. и да го съхраните в база данни за по-късен анализ на съдържанието или NLP проекти.

В електронната търговия класически пример е извличането на данни от уебсайта на авиокомпания или сайт за сравнение на полети, за да се Получете цени, разписания, летища за отправяне и пристиганеограничения за багаж и други полезни подробности. Тук и двете Заявки и BeautifulSoup, ако HTML кодът е статичен, като например Selenium, ако резултатите се появят след взаимодействие с формуляри и динамични селектори.

Друг типичен проект включва комбиниране на изстъргване с използването на Официални API, когато са наличниНапример, можете да получите информация за изпълнители, албуми и песни, използвайки Spotify API, и едновременно с това да извличате отзиви или коментари от музикални блогове и уебсайтове, за да обогатите данните си с потребителски мнения.

Ако трябва да надхвърлите еднократни сценарии и искате мащабиране до големи обеми данниПредставяме ви Scrapy, специализирана рамка за извличане на данни, която опростява живота ви с опашки от заявки, управление на паяци, мидълуер и пайплайни. Selenium все още може да бъде полезен в специфични случаи; просто го интегрирайте в паяците, които изискват изпълнение на JavaScript.

Във всички тези случаи етиката и законността все още важат: ключово е да се спазва robots.txt, да се ограничи честотата на заявките, Не влизайте в частни зони и не заобикаляйте мерките за сигурност. и използвайте данните отговорно, особено ако ще ги използвате с търговска цел.

Управление на грешки, работна среда и най-добри практики

Един надежден скрепер не е само въпрос на това да знаеш как да използваш библиотеките, а и на това... Организирайте добре работната среда, контролирайте грешките и поддържайте кода четлив и подходящ за многократна употреба.Ако проектът се разрасне дори леко, ще се радвате, че сте започнали от правилния крак.

За професионални проекти в Linux или macOS обикновено се препоръчва да създадете отделна папка за проекта, да монтирате виртуална среда с venvАктивирайте го и инсталирайте само необходимите зависимости в него: requests, beautifulsoup4, selenium, jupyter, ако ще използвате преносими компютри и т.н. Това ще улесни значително възпроизвеждането на средата, актуализирането на пакети или мигрирането на проекта към друга машина.

В по-леки среди или за бързо прототипиране, много хора се обръщат към google colabкъдето можете да инсталирате необходимите библиотеки с pip и да работите директно от браузъра. За сериозни проекти обаче е препоръчително по-късно да мигрирате към контролирана среда, където можете да версионирате кода и сигурно да управлявате идентификационните данни.

В ежедневната си работа ще се налага да се справяте с изключения. Когато заявките се провалят, когато елемент от Selenium не се появи навреме или когато BeautifulSoup не може да намери очаквания възел, Python ще генерира изключения. изключения, които, ако не бъдат засечени, ще спрат програматаИзползването на блокове try-except ви позволява да обработвате тези неуспехи, да регистрирате случилото се и да решите дали да пропуснете този URL адрес, да опитате отново или да спрете изпълнението.

Функционалният дизайн също помага значително за поддържането на ред. Разделянето на функция, която Изтегляне на страницата, друг, който анализира връзки, и друг, който извлича съдържанието на новинарска статия И друг, който съхранява данни, ви позволява да тествате всяка част поотделно, да използвате повторно код и да променяте имплементацията, когато сайтът модифицира структурата си.

И накрая, ако ще изтегляте мултимедийно съдържание, като например изображения от статии, ще искате да капсулирате тази логика в специфични функции, които я обработват. получаване на URL адреса, отправяне на заявка, запазване на файла с разумно име и обработка на грешки при свързванеПо този начин избягвате смесването на твърде много отговорности в един и същ блок код.

Накратко, ако разбирате как се изграждат съвременните уеб страници, кога статичният HTML е достатъчен и кога ви е необходим истински браузър, и ги комбинирате разумно, можете да постигнете желаните резултати. Заявки, BeautifulSoup, Selenium, API и инструменти като ScrapyМожете да автоматизирате извличането на данни доста елегантно. Важното е да го направите обмислено, като спазвате техническите и законовите ограничения и поддържате кода достатъчно организиран, така че да знаете какво прави всяка част след няколко месеца.