Î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!

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.

Cum se rascoleste articolele Wikipedia cu Python

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

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ă!