În acest articol voi crea un scraper web în Python care va răzuie paginile Wikipedia.
Scraper-ul va merge la o pagină Wikipedia, va răscoli titlul și va urma un link aleatoriu către următoarea pagină Wikipedia.
Cred că va fi distractiv să văd ce pagini Wikipedia aleatorii vor vizita acest răzuitor!
Conţinut
Configurarea răzuitorului
Pentru a începe, voi crea un nou fișier Python numit scraper.py
:
touch scraper.py
Pentru a face cererea HTTP, voi folosi requests
bibliotecă. Puteți să-l instalați cu următoarea comandă:
pip install requests
Să folosim pagina web wra scraping ca punct de plecare:
import requests
response = requests.get(
url="https://en.wikipedia.org/wiki/Web_scraping",
)
print(response.status_code)
Când rulați racleta, acesta ar trebui să afișeze un cod de stare 200:
python3 scraper.py
200
Bine, până acum bine! ?
Extragerea datelor din pagină
Să extragem titlul din pagina HTML. Pentru a-mi face viața mai ușoară, voi folosi pachetul BeautifulSoup pentru asta.
pip install beautifulsoup4
Când inspectez pagina Wikipedia, văd că eticheta de titlu are #firstHeading
ID.
Supa frumoasă vă permite să găsiți un element după eticheta de identificare.
title = soup.find(id="firstHeading")
Reunind totul împreună, programul arată acum:
import requests
from bs4 import BeautifulSoup
response = requests.get(
url="https://en.wikipedia.org/wiki/Web_scraping",
)
soup = BeautifulSoup(response.content, 'html.parser')
title = soup.find(id="firstHeading")
print(title.string)
Și când rulați acest lucru, arată titlul articolului Wiki:?
python3 scraper.py
Web scraping
Răzuirea altor linkuri
Acum o să mă scufund adânc în Wikipedia. O să iau o întâmplare <a>
etichetați un alt articol Wikipedia și răscoliți acea pagină.
Pentru a face acest lucru, voi folosi supă frumoasă pentru a găsi toate <a>
etichete din articolul wiki. Apoi, amestec lista pentru ao face aleatorie.
import requests
from bs4 import BeautifulSoup
import random
response = requests.get(
url="https://en.wikipedia.org/wiki/Web_scraping",
)
soup = BeautifulSoup(response.content, 'html.parser')
title = soup.find(id="firstHeading")
print(title.content)
# Get all the links
allLinks = soup.find(id="bodyContent").find_all("a")
random.shuffle(allLinks)
linkToScrape = 0
for link in allLinks:
# We are only interested in other wiki articles
if link['href'].find("/wiki/") == -1:
continue
# Use this link to scrape
linkToScrape = link
break
print(linkToScrape)
După cum puteți vedea, eu folosesc soup.find(id="bodyContent").find_all("a")
pentru a găsi toate <a>
etichete din articolul principal.
Deoarece mă interesează doar linkurile către alte articole din Wikipedia, mă asigur că link-ul conține /wiki
prefix.
Când rulați programul acum, acesta afișează un link către un alt articol de pe Wikipedia, frumos!
python3 scraper.py
<a href="https://www.freecodecamp.org/wiki/Link_farm" title="Link farm">Link farm</a>
Crearea unui răzuitor interminabil
În regulă, hai să facem răzuitorul să răzuiască noul link.
Pentru a face acest lucru, voi muta totul într-un scrapeWikiArticle
funcţie.
import requests
from bs4 import BeautifulSoup
import random
def scrapeWikiArticle(url):
response = requests.get(
url=url,
)
soup = BeautifulSoup(response.content, 'html.parser')
title = soup.find(id="firstHeading")
print(title.text)
allLinks = soup.find(id="bodyContent").find_all("a")
random.shuffle(allLinks)
linkToScrape = 0
for link in allLinks:
# We are only interested in other wiki articles
if link['href'].find("/wiki/") == -1:
continue
# Use this link to scrape
linkToScrape = link
break
scrapeWikiArticle("https://en.wikipedia.org" + linkToScrape['href'])
scrapeWikiArticle("https://en.wikipedia.org/wiki/Web_scraping")
scrapeWikiArticle
funcția va primi articolul wiki, va extrage titlul și va găsi un link aleatoriu.
Apoi, va apela scrapeWikiArticle
din nou cu acest nou link. Astfel, creează un ciclu nesfârșit al unui Scraper care ricoșează pe wikipedia.
Să rulăm programul și să vedem ce obținem:
pythron3 scraper.py
Web scraping
Digital object identifier
ISO 8178
STEP-NC
ISO/IEC 2022
EBCDIC 277
Code page 867
Code page 1021
EBCDIC 423
Code page 950
G
R
Mole (unit)
Gram
Remmius Palaemon
Encyclopædia Britannica Eleventh Edition
Geography
Gender studies
Feminism in Brazil
Minunat, în aproximativ 10 pași am trecut de la „Web Scraping” la „Feminism în Brazilia”. Uimitor!
Concluzie
Am construit un scraper web în Python care răzuiește paginile Wikipedia aleatorii. Se rotește la nesfârșit pe Wikipedia urmând link-uri aleatorii.
Acesta este un truc distractiv, iar Wikipedia este destul de îngăduitoare când vine vorba de răzuirea web.
Există, de asemenea, site-uri web mai greu de răzuit precum Amazon sau Google. Dacă doriți să răscoliți un astfel de site web, ar trebui să configurați un sistem cu browsere Chrome fără cap și servere proxy. Sau puteți utiliza un serviciu care se ocupă de toate acestea pentru dvs. ca acesta.
Dar aveți grijă să nu abuzați de site-uri web și să răscoliți doar datele pe care vi se permite să le răscoliți.
Codificare fericită!
#Cum #răscolește #articolele #Wikipedia #Python
Cum se răscolește articolele Wikipedia cu Python