Sådan skrabes Wikipedia-artikler med Python

I denne artikel skal jeg oprette en webskraber i Python, der vil skrabe Wikipedia-sider.

Skraberen går til en Wikipedia-side, skraber titlen og følger et tilfældigt link til den næste Wikipedia-side.

Jeg synes, det vil være sjovt at se, hvilke tilfældige Wikipedia-sider denne skraber vil besøge!

Opsætning af skraberen

For at starte skal jeg oprette en ny python-fil kaldet scraper.py:

touch scraper.py

For at komme med HTTP-anmodning skal jeg bruge requestsbiblioteket. Du kan installere det med følgende kommando:

pip install requests

Lad os bruge wiki-siden til webskrabning som vores udgangspunkt:

import requests response = requests.get( url="//en.wikipedia.org/wiki/Web_scraping", ) print(response.status_code) 

Når du kører skraberen, skal den vise en 200 statuskode:

python3 scraper.py 200

Okay, indtil videre så godt! ?

Uddrag af data fra siden

Lad os udtrække titlen fra HTML-siden. For at gøre mit liv lettere skal jeg bruge BeautifulSoup-pakken til dette.

pip install beautifulsoup4

Når jeg inspicerer Wikipedia-siden, ser jeg, at titelmærket har #firstHeadingID'et.

Smuk suppe giver dig mulighed for at finde et element ved hjælp af ID-koden.

title = soup.find(id="firstHeading")

At bringe det hele sammen ser programmet nu sådan ud:

import requests from bs4 import BeautifulSoup response = requests.get( url="//en.wikipedia.org/wiki/Web_scraping", ) soup = BeautifulSoup(response.content, 'html.parser') title = soup.find(id="firstHeading") print(title.string) 

Og når du kører dette, viser det titlen på Wiki-artiklen:?

python3 scraper.py Web scraping

Skrabning af andre links

Nu skal jeg dykke dybt ned i Wikipedia. Jeg vil gribe et tilfældigt tag til en anden Wikipedia-artikel og skrabe den side.

For at gøre dette vil jeg bruge smuk suppe til at finde alle tags i wiki-artiklen. Derefter blander jeg listen for at gøre den tilfældig.

import requests from bs4 import BeautifulSoup import random response = requests.get( url="//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)

Som du kan se, bruger jeg den soup.find(id="bodyContent").find_all("a")til at finde alle tags i hovedartiklen.

Da jeg kun er interesseret i links til andre wikipedia-artikler, sørger jeg for, at linket indeholder /wikipræfikset.

Når programmet kører nu, viser det et link til en anden wikipedia-artikel, dejligt!

python3 scraper.py Link farm

Oprettelse af en endeløs skraber

Okay, lad os få skraberen til at skrabe det nye link.

For at gøre dette vil jeg flytte alt til en scrapeWikiArticlefunktion.

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("//en.wikipedia.org" + linkToScrape['href']) scrapeWikiArticle("//en.wikipedia.org/wiki/Web_scraping")

Den scrapeWikiArticlefunktion vil få wiki artiklen, udtrække titlen, og finde en tilfældig link.

Derefter vil det ringe til scrapeWikiArticleigen med dette nye link. Således skaber det en endeløs cyklus af en skraber, der hopper rundt på wikipedia.

Lad os køre programmet og se, hvad vi får:

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  Eleventh Edition Geography Gender studies Feminism in Brazil

Fantastisk, i cirka 10 trin gik vi fra "Web Scraping" til "Feminism in Brazil". Fantastiske!

Konklusion

Vi har bygget en webskraber i Python, der skraber tilfældige Wikipedia-sider. Det hopper uendeligt rundt på Wikipedia ved at følge tilfældige links.

Dette er en sjov gimmick, og Wikipedia er ret mild, når det kommer til webskrabning.

Der er også sværere at skrabe websteder som Amazon eller Google. Hvis du vil skrabe et sådant websted, skal du oprette et system med hovedløse Chrome-browsere og proxyservere. Eller du kan bruge en tjeneste, der håndterer alt det for dig som denne.

Men pas på ikke at misbruge websteder og kun skrabe data, som du har lov til at skrabe.

God kodning!