Як скребувати статті Вікіпедії за допомогою Python

У цій статті я збираюся створити веб-скрепер на Python, який буде очищати сторінки Вікіпедії.

Скребок перейде на сторінку Вікіпедії, зішкребує заголовок і переходить за випадковим посиланням на наступну сторінку Вікіпедії.

Думаю, буде цікаво спостерігати, які випадкові сторінки Вікіпедії відвідає цей скрепер!

Налаштування скребка

Для початку я збираюся створити новий файл python з назвою scraper.py:

touch scraper.py

Щоб зробити запит HTTP, я збираюся скористатися requestsбібліотекою. Ви можете встановити його за допомогою наступної команди:

pip install requests

Давайте скористаємось вікі-сторінкою з веб-скрапу як нашою відправною точкою:

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

Під час запуску скребка він повинен відображати код стану 200:

python3 scraper.py 200

Гаразд, поки що добре! ?

Вилучення даних зі сторінки

Давайте витягнемо заголовок зі сторінки HTML. Щоб полегшити своє життя, я буду використовувати для цього пакет BeautifulSoup.

pip install beautifulsoup4

Переглядаючи сторінку Вікіпедії, я бачу, що тег заголовка має #firstHeadingідентифікатор.

Гарний суп дозволяє знайти елемент за тегом ID.

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

Об’єднавши все це, програма тепер виглядає так:

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) 

І при запуску цього, він відображає заголовок статті Вікі:?

python3 scraper.py Web scraping

Вишкрібання інших посилань

Зараз я занурююся вглиб Вікіпедії. Я збираюся взяти довільний тег до іншої статті Вікіпедії і зішкребти цю сторінку.

Для цього я буду використовувати красивий суп, щоб знайти всі теги у статті wiki. Потім я перемішую список, щоб зробити його випадковим.

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)

Як бачите, я використовую, soup.find(id="bodyContent").find_all("a")щоб знайти всі теги в основній статті.

Оскільки мене цікавлять лише посилання на інші статті wikipedia, я переконуюсь, що посилання містить /wikiпрефікс.

Під час запуску програми вона відображає посилання на іншу статтю Вікіпедії, приємно!

python3 scraper.py Link farm

Створення нескінченного скребка

Добре, давайте змусимо скребок насправді скребти нове посилання.

Для цього я збираюся перенести все у scrapeWikiArticleфункцію.

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")

scrapeWikiArticleФункція отримає вики - статтю, витягти заголовок і знайти випадкову зв'язок.

Потім він знову зателефонує за scrapeWikiArticleцим новим посиланням. Таким чином, це створює нескінченний цикл Скребка, який відскакує у вікіпедії.

Давайте запустимо програму і подивимось, що ми отримаємо:

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

Приголомшливо, приблизно за 10 кроків ми пройшли шлях від "Веб-скрапінгу" до "Фемінізму в Бразилії". Дивовижний!

Висновок

Ми створили веб-скрепер на Python, який видаляє випадкові сторінки Вікіпедії. Він нескінченно відскакує у Вікіпедії, переходячи за випадковими посиланнями.

Це весела хитрість, а Вікіпедія досить м’яка, коли справа стосується вишкрібання веб-сторінок.

Також важче скребувати веб-сайти, такі як Amazon або Google. Якщо ви хочете стерти такий веб-сайт, вам слід налаштувати систему з безголовими браузерами Chrome та проксі-серверами. Або ви можете скористатися послугою, яка обробляє все, що вам подобається, як ця.

Але будьте обережні, щоб не зловживати веб-сайтами, а лише згрібати дані, які вам дозволено.

Щасливого кодування!