Hvordan skrape Wikipedia-artikler med Python

I denne artikkelen skal jeg lage en nettskrape i Python som skal skrape Wikipedia-sider.

Skrapen går til en Wikipedia-side, skraper tittelen og følger en tilfeldig lenke til neste Wikipedia-side.

Jeg tror det blir morsomt å se hvilke tilfeldige Wikipedia-sider denne skrapen vil besøke!

Sette opp skrapen

For å begynne med skal jeg lage en ny python-fil som heter scraper.py:

touch scraper.py

For å komme med HTTP-forespørsel, skal jeg bruke requestsbiblioteket. Du kan installere den med følgende kommando:

pip install requests

La oss bruke wiki-siden for skraping av nettet som utgangspunkt:

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

Når du kjører skrapen, skal den vise en 200 statuskode:

python3 scraper.py 200

Greit, så langt så bra! ?

Henter ut data fra siden

La oss trekke ut tittelen fra HTML-siden. For å gjøre livet mitt enklere skal jeg bruke BeautifulSoup-pakken til dette.

pip install beautifulsoup4

Når jeg inspiserer Wikipedia-siden, ser jeg at tittelkoden har #firstHeadingID-en.

Vakker suppe lar deg finne et element etter ID-koden.

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

Å bringe det hele sammen ser programmet ut slik:

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 kjører dette, viser det tittelen på Wiki-artikkelen:?

python3 scraper.py Web scraping

Skraping av andre lenker

Nå skal jeg dykke dypt inn i Wikipedia. Jeg skal ta en tilfeldig tag til en annen Wikipedia-artikkel og skrape den siden.

For å gjøre dette vil jeg bruke vakker suppe for å finne alle kodene i wiki-artikkelen. Så blander jeg listen for å gjøre den tilfeldig.

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 ser, bruker jeg for soup.find(id="bodyContent").find_all("a")å finne alle kodene i hovedartikkelen.

Siden jeg bare er interessert i lenker til andre wikipedia-artikler, sørger jeg for at lenken inneholder /wikiprefikset.

Når du kjører programmet, viser det nå en lenke til en annen wikipedia-artikkel, fint!

python3 scraper.py Link farm

Å skape en endeløs skrape

Greit, la oss få skrapen til å skrape den nye lenken.

For å gjøre dette skal jeg flytte alt til en scrapeWikiArticlefunksjon.

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 scrapeWikiArticlefunksjonen vil få wiki artikkelen, trekke tittelen, og finne en tilfeldig link.

Deretter vil den ringe scrapeWikiArticleigjen med denne nye lenken. Dermed skaper det en endeløs syklus av en skraper som spretter rundt på wikipedia.

La oss kjøre programmet og se hva 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 omtrent ti trinn gikk vi fra "Web Scraping" til "Feminism in Brazil". Fantastisk!

Konklusjon

Vi har bygget en nettskrape i Python som skraper tilfeldige Wikipedia-sider. Den spretter uendelig rundt på Wikipedia ved å følge tilfeldige lenker.

Dette er en morsom gimmick, og Wikipedia er ganske mild når det gjelder nettskraping.

Det er også vanskeligere å skrape nettsteder som Amazon eller Google. Hvis du vil skrape et slikt nettsted, bør du sette opp et system med hodeløse Chrome-nettlesere og proxy-servere. Eller du kan bruke en tjeneste som håndterer alt det for deg som denne.

Men vær forsiktig så du ikke misbruker nettsteder, og bare skrap data du har lov til å skrape.

God koding!