Pag-scrape ng web gamit ang BeautifulSoup at Selenium: isang kumpletong gabay

  • Ang BeautifulSoup at Requests ay mainam para sa static scraping ng HTML na na-render na mula sa server.
  • Binibigyang-daan ka ng Selenium na mag-load ng JavaScript, pangasiwaan ang mga iframe, at gayahin ang mga aksyon ng user sa mga dynamic na pahina.
  • Ang pagsasama ng Selenium para sa pag-render at BeautifulSoup para sa pag-parse ay nagbibigay ng flexibility at katumpakan.
  • Ang etika, paggalang sa robots.txt, at mahusay na pamamahala ng error ay susi sa anumang proyekto ng scraping.

Pag-scrape ng web gamit ang BeautifulSoup at Selenium

Kapag tinanong ka ng boss mo subaybayan ang mga presyo ng mga kakumpitensya, suriin ang mga review, o mangalap ng data mula sa daan-daang pahinaHindi na opsyon ang manu-manong pagkopya at pag-paste. Kailangan mo ng paraan para awtomatiko ang pagkuha ng impormasyon nang hindi nababaliw o nagsasayang ng oras sa paulit-ulit na mga gawain.

Sa Python ecosystem, ang dalawang tool na madalas mong maririnig para dito ay Magandang Sopas at SeleniumAng isa ay mahusay sa mabilis at madaling pagsusuri ng HTML; ang isa naman ay kayang magbukas ng totoong browser, magpatakbo ng JavaScript, mag-click, punan ang mga form, at kumilos na parang isang taong gumagamit. Ang susi ay ang pag-unawa rito nang mabuti. kailan gagamitin ang bawat isa at kung paano pagsamahin ang mga ito para masulit sila.

Ano ang web scraping at kailan ito makatuwiran na gamitin?

Ang pag-scrape ng web ay walang iba kundi ang proseso ng pagkuha ng datos mula sa mga web pageMagagawa mo ito sa pamamagitan ng pagkopya at pag-paste, ngunit habang lumalaki ang dami ng impormasyon, makatuwiran na umasa sa mga script o awtomatikong tool na dumadaan sa mga pahina at nagse-save ng kung ano ang iyong kinagigiliwan.

Sa pamamagitan ng pagkayod, magagawa mo Gumawa ng mga listahan ng produkto at mga presyo, balita, review, komento, at mga post sa social media o halos anumang nilalaman na pampublikong makukuha sa web. Sa esensya, ito ang paunang hakbang para sa maraming pagsusuri ng datos, machine learning, o mga proyekto sa pag-aautomat ng gawain.

Gayunpaman, mahalagang maging malinaw kung kailan dapat gamitin ang scraping bilang iyong estratehiya. huling paraan, hindi ang unaKung ang site ay nag-aalok na ng isang mahusay na dokumentadong opisyal na API, kadalasan ay mas mainam na gamitin ito: mas matatag ito, kadalasan ay may malinaw na mga limitasyon sa paggamit, at binabawasan ang panganib ng paglabag sa anumang bagay o paglabag sa mga tuntunin ng serbisyo.

Nagsisimulang magkaroon ng kahulugan ang pagkayod kapag Walang API, hindi kumpleto ang API, o kailangan mo ng data na lumalabas lang sa web interface., tulad ng mga naka-embed na komento, ranggo, maliliit na tag, o mga bloke ng nilalaman na dynamic na nabuo.

Mahalaga ring makilala ang dalawang konsepto na kadalasang nalilito: pag-scrape ng web at pag-crawl ng webAng scraping ay nakatuon sa pagkuha ng mga partikular na datos mula sa mga partikular na pahina; ang crawling, sa kabilang banda, ay nakatuon sa upang galugarin at imapa ang istruktura ng isang site o ng buong websa pamamagitan ng pagsunod sa mga link, tulad ng ginagawa ng mga search engine sa pag-index ng nilalaman.

Mga aspetong legal at etikal: mga bagay na hindi mo dapat balewalain

Bago mo padalusin ang iyong scraper nang walang ingat, mahalagang maglaan ng ilang sandali upang pag-isipan ang tungkol sa legal, teknikal, at etikal na implikasyonAng pag-scrape ng sarili mong website o isang akademikong proyekto ay hindi katulad ng pag-set up ng isang komersyal na serbisyo batay sa datos ng ibang tao.

Ang unang bagay na dapat suriin ay kung ikaw ay pagsunod sa batas ng iyong bansa o rehiyonAng mga isyu tulad ng proteksyon ng datos, privacy, at paggamit ng personal na impormasyon ay maaaring mag-iba nang malaki sa bawat lugar, kaya hindi magandang ideya na balewalain ang mga ito. Kung gagawa ka ng sensitibo o makikilalang datos, pinakamahusay na kumonsulta sa isang taong may kaalaman tungkol sa batas sa teknolohiya.

Ang susunod na hakbang ay ang pagsuri kung ang site ay mayroon mga tuntunin sa paggamit na nagbabawal sa pag-scrapeMaraming portal ang may kasamang mga partikular na sugnay sa kanilang mga Tuntunin at Kundisyon patungkol sa awtomatikong pagkuha ng datos, komersyal na paggamit ng impormasyon, o hindi awtorisadong pag-access sa ilang partikular na seksyon.

May isang mahalagang piraso na halos palagi mong dapat tingnan: ang file robots.txtMakikita mo ito sa root ng domain, parang ganito https://www.ejemplo.com/robots.txtDoon, ipinapahiwatig ng may-ari kung aling mga ruta ang ayaw nilang i-crawl o i-index, halimbawa sa pamamagitan ng mga direktiba tulad ng hindi pahintulutan harangan ang mga ruta o Pagkaantala sa pag-crawl upang matiyak ang pinakamababang pagkaantala sa pagitan ng mga kahilingan.

Ang paggalang sa mga alituntuning ito ay hindi lamang usapin ng etika, ito rin ay isang paraan ng Huwag mag-overload ng daan-daang request kada segundo ang isang server.Ang isang scraper na hindi maganda ang disenyo ay maaaring magmukhang isang denial-of-service attack, at bukod sa pagiging hindi elegante, maaari rin itong magdulot ng mga problema.

Panghuli, tanungin ang iyong sarili kung Ang layunin mong gamitin ang datos ay makatwiran.Ipapamahagi mo ba ulit ang mga ito kung ano na ang umiiral? Ihahalo mo ba ang mga ito sa ibang mga mapagkukunan? Para ba ito sa isang panloob na proyekto o para muling ibenta ang impormasyon? Ang mga tanong na ito ay lubos na nakakaimpluwensya sa mga panganib at kung paano mo dapat idisenyo ang iyong solusyon.

Paano aktwal na naglo-load ang isang web page: HTML, CSS, JavaScript, at iframes

Para epektibong makapag-scrape, mahalagang maunawaan kung ano talaga ang nakikita ng iyong script kapag humiling ito. Sa isang mainam na mundo, ang pahinang matatanggap mula sa server ay dapat na kasama na ang lahat ng HTML na may nilalamang interesado kaAt ang gagawin lang ng browser ay i-estilo ito gamit ang CSS at magdagdag ng kaunting interactivity sa JavaScript.

Ang katotohanan ay hindi gaanong maganda: maraming modernong website Naglo-load sila ng data na na-defer gamit ang JavaScript, at nag-e-embed ng third-party na content gamit ang mga iframe. o kaya naman ay agad nilang isinusulat ang DOM. Kung bubuksan mo ang klasikong menu na "View Source" ng browser, minsan ay wala kang makikitang anumang bakas ng mga komento, counter, o dynamic block na lumalabas sa screen.

Isang tipikal na halimbawa ay ang mga sistema ng pagkokomento tulad ng DisqusAng orihinal na HTML ay maaaring walang kahit isang linya ng mga komento, ngunit ang panghuling DOM na nabuo ng browser ay maaaring maglaman nito. iframe na ginawa ng JavaScript kung saan naka-load ang buong thread. Kung susubukan mong gumawa ng static scraping ng pahinang iyon, magkakaroon ka ng "pile" na HTML.

Sa ganitong uri ng mga senaryo, ang estratehiya ay kinabibilangan ng gayahin ang ginagawa ng totoong browserI-load ang pahina, hayaang tumakbo ang JavaScript, hintaying lumitaw ang mga elementong gusto mo, at pagkatapos ay kunin ang nilalaman. Diyan pumapasok ang Selenium.

Static scraping gamit ang Requests at BeautifulSoup

Kapag ang nilalamang kailangan mo ay nasa unang HTML na (karaniwang produkto, balita, simpleng mga talahanayan, mga static na listahan), ang pinakaepektibong paraan ay karaniwang gamitin Mga kahilingan para gawin ang kahilingang HTTP at BeautifulSoup para i-parse ang HTMLIto ang klasikong pares para sa magaan at mabilis na pagkayod.

Ang pangunahing daloy ay simple: una ay magpadala ka ng isang kahilingan gamit ang mga kahilingan.kunin(url) at sinusuri mo ang tugon. Bagay na hawak mo, maaari mong tingnan ang status code na may status_code, ang tekstwal na nilalaman na may teksto, o ang binary na nilalaman na may nilalaman, bilang karagdagan sa pagsisiyasat sa mga header at final URL upang mas maunawaan kung ano ang ibinabalik ng server.

Kapag mayroon ka na ng HTML, ipapasa mo ito sa BeautifulSoup, kadalasan ay ganito ang gamit: BeautifulSoup(html, "html.parser")Pinaghihiwa-hiwalay ng parser ang teksto sa isang istrukturang puno na mas maginhawa para sa paghahanap ng mga tag, katangian, at nested content.

Gamit ang bagay na sopas na iyon, maaari mo na ngayong gamitin ang mga pamamaraan tulad ng hanapin, hanapin_lahat o piliin upang mahanap ang mga partikular na node: halimbawa, lahat ng na naglalaman ng mga tutorial, mga hanay ng isang talahanayan, mga link sa isang seksyon ng balita o anumang bahagi ng pahina na may makatwirang magkakaugnay na istrukturang HTML.

Isang tipikal na halimbawa ay ang pag-set up ng scraper para sa isang digital na pahayagan tulad ng Pahina 12. Maaari kang humiling sa unang pahina, suriin ang mga bloke ng seksyon, hanapin ang mga link ng balita At mula roon, sistematikong mag-navigate upang maihatid sa iyo ang mga headline, petsa, katawan ng teksto, pangunahing mga larawan at anumang datos na interesado ka, ibinabalot ang mga ito sa mga diksyunaryo na handa nang i-save sa isang database.

Sa mga scraper na ito, ipinapayong magdagdag ng lohika paghawak ng error gamit ang try-except Upang maiwasan ang kahit isang pagkabigo (isang balita na may binagong istruktura, isang nabigong kahilingan, isang nawawalang tag) na magpahinto sa buong proseso, ang paghuli sa mga partikular na eksepsiyon at pagpapasya kung kailan babalewalain ang mga error at kung kailan titigil ay bahagi ng pang-araw-araw na gawain para sa mga ganitong uri ng proyekto.

Dynamic scraping gamit ang Selenium: JavaScript, iframes, at mga aksyon ng user

Kapag ang web ay nagsimulang umasa sa JavaScript para sa lahat ng bagay, ang static scraping ay nagkukulang. Kung ang nilalaman ay nabubuo nang walang katiyakan, ito ay nagtatago sa likod ng isang iframe o lilitaw lamang pagkatapos makipag-ugnayan sa mga button, form, o dynamic na elementoKailangan mo ng totoong browser o headless browser na magpapatupad ng lahat ng lohikang iyon.

Dito ibinabaluktot ng Selenium ang mga kalamnan nito. Ang Selenium ay orihinal na dinisenyo upang Awtomatikong pagsubok sa pagganap ng mga web applicationNgunit ang kakayahan nitong humawak ng browser—pagbubukas ng mga pahina, pag-click, pagpuno ng mga input, paghihintay na mag-load ang nilalaman—ay ginagawa itong isang napakalakas na tool para sa dynamic scraping.

Ang puso ng Selenium ay ang WebDriver, isang bahagi na kumokontrol sa napiling browser (Chrome, Firefox, at iba pa). Para magamit ito, kailangan mo ang driver na partikular sa browser (geckodriver para sa Firefox, chromedriver para sa Chrome, atbp.), na dapat ay nasa isang path na maa-access mula sa iyong system, na karaniwang kasama sa PATH environment variable.

Ang pangunahing pag-install ng Python ay ginagawa gamit ang isang bagay tulad ng pip install seleniumMula doon, sa iyong script ay gagawa ka ng isang instance ng WebDriver, halimbawa gamit ang webdriver.Firefox() o webdriver.Chrome()At ngayon ay maaari ka nang magsimulang mag-browse, magbukas ng mga URL o makipag-ugnayan sa pahina na parang isa kang totoong user.

Kung tungkol sa uri ng browser, maaari kang gumamit ng isang buong browser na may graphical interface o isang browser na nasa standby mode. walang uloSa teorya, may mga alternatibo tulad ng PhantomJS, ngunit sa pagsasagawa, maraming tao ang nag-ulat ng mga hindi pagkakatugma at kakaibang pag-uugali, kaya karaniwang mas mainam na gamitin... gumamit ng Chrome o Firefox sa real o headless mode para mabawasan ang mga sorpresa.

Kapag na-load na ang pahina, pinapayagan ka ng Selenium na hanapin ang mga elemento gamit ang iba't ibang uri ng mga selector: ayon sa id, pangalan, klase, CSS selector o XPathMaaari kang tumawag ng mga pamamaraan tulad ng find_element o find_elements at mula roon, maglunsad ng mga aksyon tulad ng click, send_keys o kunin ang nakikitang teksto ng bawat node.

Pagsamahin ang Selenium at BeautifulSoup para masulit ito

Ang pinakamalakas na kombinasyon para sa mga kumplikadong lugar ay karaniwang ang mga sumusunod: Ang Selenium ang humahawak sa paglo-load ng pahina, pagpapatupad ng JavaScript, at paghahanda ng pangwakas na DOM; pagkatapos ay papasok ang BeautifulSoup upang i-parse ang na-render na HTML at kunin ang data. kasama ang lahat ng kaginhawahan ng mga function sa paghahanap nito.

Simple lang ang pangkalahatang padron. Una, i-initialize mo ang WebDriver, pagkatapos ay i-load ang URL gamit ang driver.get() At, kung kinakailangan, hihintayin mong lumitaw ang ilang mahahalagang elemento gamit ang mga tahasang paghihintay. Kapag sigurado ka nang na-load na ang nilalaman, makukuha mo ang Pangwakas na HTML gamit ang driver.page_source.

Ipapasa mo ang HTML na iyon sa BeautifulSoup, tulad ng gagawin mo sa static scraping, para ulitin mga talahanayan, listahan, artikulo, hanay, o anumang bloke na may paulit-ulit na istrukturaNagbibigay-daan ito sa iyong gamitin ang kakayahan ng mga Selenium selector upang maabot ang tamang bahagi ng pahina, at ang kakayahang umangkop ng BeautifulSoup upang malinis na makuha ang data.

Sa mga pahinang gumagamit ng mga iframe, tulad ng mga komento sa Disqus, madalas mong kailanganin baguhin ang konteksto sa partikular na iframe bago kumuha ng nilalaman. Gamit ang Selenium, mahahanap mo ang iframe - halimbawa, ang isa na nakasabit sa lalagyan na may id disqus_thread -, gamitin ang switch_to.frame at, kapag nasa loob na, hintaying mag-load ang mga elemento tulad ng comment counter o text blocks.

Sa ibang mga kaso, tulad ng mga content generator, mas halata ang kombinasyon. Isipin ang isang Star Wars name generator na nagbibigay-daan sa iyong pumili Kung gusto mo ng mga pangalang lalaki, babae, o halo-halong pangalan, at ilan ang gusto mo nang sabay-sabayHalimbawa, 100 pangalan bawat pag-click. Inaasikaso ng Selenium ang pagpili ng naaangkop na opsyon (halimbawa, ang radio button na may name="choice" at value="100"), pag-click sa button na "Bumuo", at paghihintay sa pagbuo ng talahanayan ng mga pangalan.

Kapag lumabas na ang talaan ng mga pangalan, kukunin mo na ang driver.page_source, ipapasa mo ito sa BeautifulSoupHahanapin mo ang katumbas na talahanayan (halimbawa, ang pang-apat na talahanayan sa pahina) at kukunin ang lahat ng mga cell mula rito. Nililinis mo ang teksto, pinapalitan ang mga hindi pangkaraniwang karakter, inaalis ang mga duplicate, at sine-save ang bawat bagong pangalan sa isang listahan.

Sa isang loop na inuulit ang prosesong ito hanggang sa, halimbawa, maabot ang 100.000 pangalan, awtomatiko ang Selenium sa interaksyon ng user interface, at ang BeautifulSoup naman ang humahawak sa pagkuha at paglilinis ng datos. Hindi naman bihira na ang ganitong proseso ay tumagal nang ilang sandali. higit sa isang orasSamakatuwid, ipinapayong kontrolin ang mga timing, pangasiwaan ang mga eksepsiyon at, kung kinakailangan, i-save ang mga intermediate na estado upang maiwasan ang pagkawala ng trabaho.

Mga praktikal na gamit gamit ang BeautifulSoup, Selenium at mga API

Gamit ang lahat ng mga piyesang ito sa mesa, makakabuo ka ng iba't ibang proyekto mula sa Mula sa mga simpleng scraper para sa personal na paggamit hanggang sa mga kumplikadong malakihang pipeline ng pagkuhaAng mahalagang bagay ay ang pumili ng tamang tool para sa bawat layer.

Sa larangan ng paglalathala, halimbawa, maaari kang mag-set up ng isang sistema na nagko-crawl sa website ng isang pahayagan, at kumukuha ng Para sa mga artikulo sa isang partikular na seksyon, i-download ang pangunahing teksto, awtor, petsa, mga tag, at pangunahing larawan. at iimbak ito sa isang database para sa mga susunod na proyekto sa content analysis o NLP.

Sa e-commerce, isang klasikong halimbawa ay ang pag-scrape ng website ng isang airline o isang site ng paghahambing ng flight upang Kumuha ng mga presyo, iskedyul, pinagmulan at patutunguhang paliparanmga paghihigpit sa bagahe at iba pang kapaki-pakinabang na detalye. Dito pareho Mga Kahilingan at BeautifulSoup kung ang HTML ay static, tulad ng Selenium kung ang mga resulta ay lilitaw pagkatapos makipag-ugnayan sa mga form at dynamic selector.

Ang isa pang tipikal na proyekto ay kinabibilangan ng pagsasama ng pagkayod gamit ang Mga opisyal na API kapag availableHalimbawa, makakakuha ka ng impormasyon tungkol sa mga artista, album, at kanta gamit ang Spotify API at, kasabay nito, makakakuha ng mga review o komento mula sa mga blog at website ng musika upang pagyamanin ang iyong data gamit ang mga opinyon ng gumagamit.

Kung kailangan mong lumampas sa mga minsanang script at gusto mo sukatin sa malalaking volume ng dataIpasok ang Scrapy, isang espesyalisadong scraping framework na nagpapadali sa iyong buhay gamit ang mga request queues, spider management, middleware, at pipelines. Maaari pa ring maging kapaki-pakinabang ang Selenium sa mga partikular na kaso; isama lamang ito sa mga spider na nangangailangan ng JavaScript execution.

Sa lahat ng mga kasong ito, nalalapat pa rin ang etika at legalidad: mahalagang igalang ang robots.txt, i-moderate ang dalas ng mga kahilingan, Huwag pumasok sa mga pribadong lugar o lumabag sa mga hakbang pangseguridad. at gamitin ang datos nang responsable, lalo na kung gagamitin mo ito nang komersyo.

Pamamahala ng error, mga kapaligiran sa trabaho, at mga pinakamahusay na kasanayan

Ang isang robust scraper ay hindi lamang tungkol sa pag-alam kung paano gamitin ang mga library, ito rin ay tungkol sa Ayusin nang mabuti ang kapaligiran sa trabaho, kontrolin ang mga error, at panatilihing nababasa at magagamit muli ang code.Kung lumago man nang kaunti ang proyekto, matutuwa ka na nagsimula ka nang tama.

Para sa mga propesyonal na proyekto sa Linux o macOS, karaniwang inirerekomenda na lumikha ng isang partikular na folder para sa proyekto, mag-mount ng virtual na kapaligiran gamit ang venvI-activate ito at i-install lamang ang mga kinakailangang dependency sa loob nito: requests, beautifulsoup4, selenium, jupyter kung gagamit ka ng mga notebook, atbp. Mas mapapadali nito ang pagkopya ng environment, pag-update ng mga package, o paglipat ng proyekto sa ibang makina.

Sa mas magaan na kapaligiran o para sa mabilis na paggawa ng prototype, maraming tao ang bumabaling sa google colabkung saan maaari mong i-install ang mga kinakailangang library gamit ang pip at direktang magtrabaho mula sa browser. Gayunpaman, para sa mga seryosong proyekto, ipinapayong lumipat sa ibang pagkakataon sa isang kontroladong kapaligiran kung saan maaari mong i-bersyon ang code at ligtas na pamahalaan ang mga kredensyal.

Sa iyong pang-araw-araw na gawain, kakailanganin mong harapin ang mga eksepsiyon. Kapag nabigo ang mga kahilingan, kapag ang isang elemento ng Selenium ay hindi lumitaw sa oras, o kapag hindi mahanap ng BeautifulSoup ang node na iyong inaasahan, magtatapon ang Python ng mga eksepsiyon. mga eksepsiyon na, kung hindi mahuhuli, ay magpapahinto sa programaAng paggamit ng mga try-except block ay nagbibigay-daan sa iyong pangasiwaan ang mga pagkabigong ito, itala ang nangyari, at magpasya kung lalaktawan ang URL na iyon, subukan muli, o ihihinto ang pagpapatupad.

Malaki rin ang naitutulong ng disenyong pang-functional upang mapanatili ang kaayusan. Ang paghihiwalay ng isang tungkulin na I-download ang pahina, isa pa na nag-parse ng mga link, isa pa na kumukuha ng nilalaman ng isang artikulo ng balita At ang isa pa na nag-iimbak ng data ay nagbibigay-daan sa iyong subukan ang bawat bahagi nang hiwalay, muling gamitin ang code, at baguhin ang implementasyon kapag binago ng site ang istruktura nito.

Panghuli, kung magda-download ka ng multimedia content tulad ng mga itinatampok na larawan mula sa mga artikulo, gugustuhin mong isama ang lohikang iyon sa mga partikular na function na humahawak dito. tanggapin ang URL, gawin ang kahilingan, i-save ang file gamit ang makatwirang pangalan, at pangasiwaan ang mga error sa koneksyonSa ganitong paraan, maiiwasan mo ang paghahalo ng napakaraming responsibilidad sa iisang bloke ng code.

Sa madaling salita, kung naiintindihan mo kung paano binubuo ang mga modernong web page, kung kailan sapat ang static na HTML at kung kailan mo kailangan ng totoong browser, at pagsasamahin mo ang mga ito nang matalino, makakamit mo ang ninanais na mga resulta. Mga Kahilingan, BeautifulSoup, Selenium, mga API at mga tool tulad ng ScrapyMaaari mong i-automate ang pagkuha ng datos nang may kahusayan. Ang mahalaga ay gawin ito nang may pag-iisip, igalang ang mga teknikal at legal na limitasyon, at panatilihing organisado ang code nang sapat upang malaman mo pa rin kung ano ang gagawin ng bawat bahagi pagkalipas ng ilang buwan mula ngayon.