парсинг сайтов на python

В этой статье создадим веб-парсер на Python, который будет парсить страницы Википедии.

Парсер перейдет на страницу Википедии, считает заголовок и перейдет по случайной ссылке на следующую страницу Википедии.

Я думаю, будет интересно посмотреть, какие случайные страницы Википедии посетит этот парсер!

Установка парсера

Для начала создадим новый файл Python с именем scraper.py:

touch scraper.py

Чтобы сделать HTTP-запрос, будем использовать библиотеку запросов. Вы можете установить её с помощью следующей команды:

pip install requests

Давайте использовать вики-страницу для парсинга в качестве отправной точки:

import requests

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

При запуске парсера он должен отображать код состояния 200:

python3 scraper.py
200

Хорошо, пока все хорошо!

Извлечение данных со страницы

Давайте извлечем заголовок из HTML-страницы. Чтобы облегчить себе жизнь, будем использовать для этого пакет BeautifulSoup.

pip install beautifulsoup4

При просмотре страницы Википедии я вижу, что тег заголовка имеет идентификатор #firstHeading.

BeautifulSoup позволяет найти элемент по ID тегу.

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

Собирая все вместе, программа теперь выглядит так:

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)

И при запуске он показывает заголовок статьи Wiki:

python3 scraper.py
Web scraping

Парсинг других ссылок

Теперь углубимся в Википедию. Возьмем случайный тег <a> к другой статье Википедии и спарсим эту страницу.

Для этого воспользуемся BeautifulSoup, чтобы найти все теги <a> в статье вики. Затем перемешаем список, чтобы сделать его случайным.

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)

Как видите, мы используем soup.find (id = «bodyContent»). Find_all («a»), чтобы найти все теги в основной статье.

Поскольку нас интересуют только ссылки на другие статьи в Википедии, удостоверяемся, что ссылка содержит префикс / wiki.

Теперь при запуске программы отображается ссылка на другую статью в Википедии, приятно!

python3 scraper.py
<a href="/wiki/Link_farm" title="Link farm">Link farm</a>

Создание бесконечного парсера

Хорошо, давайте заставим парсер очищать новую ссылку.

Для этого переместим все в функцию 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("https://en.wikipedia.org" + linkToScrape['href'])

scrapeWikiArticle("https://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
Encyclopædia Britannica Eleventh Edition
Geography
Gender studies
Feminism in Brazil

Замечательно, примерно за 10 шагов мы прошли путь от «Веб-скрейпинга» до «Феминизма в Бразилии». Удивительно!

Вывод

Мы создали веб-парсер на Python, который парсит случайные страницы Википедии. Он бесконечно перемещается по Википедии по случайным ссылкам.

Это забавный трюк, и Википедия довольно снисходительна, когда дело касается парсинга веб-страниц.

Также труднее парсить такие сайты, как Amazon или Google. Если вы хотите спарсить такой веб-сайт, вам следует настроить систему с автономными браузерами Chrome и прокси-серверами. Или вы можете использовать сервис, который сделает все за вас, как этот.

Но будьте осторожны, не злоупотребляйте веб-сайтами и парсите только те данные, которые вам разрешено парсить.

Удачного кодирования!