Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
vp-webdev
6 лет назад

Парсинг данных средствами Python


В один прекрасный день мне понадобилась база данных с анекдотами. Если быть точным, я решил добавить в своего голосового ассистента функцию, которая по запросу "Расскажи анекдот" выдавала бы случайный анекдот. Пользоваться данной функцией приходилось в местах, где нет интернета, поэтому было решено спарсить базу анекдотов, желательно большого размера.

Я решил парсить сайт http://anekdotme.ru/random на странице которого при каждом обращении случайным образом показывались 30 анекдотов.

Недолго думая я набросал скрипт на Python который парсит базу и получает на выходе .db файл содержащий 90 тысяч анекдотов. Время парсинга такого огромного количества анекдотов - примерно 3-4 часа, причем желательно не выключать скрипт, не дождавшись пока он не отработает до конца.

import requests, bs4
import sqlite3
import re
import time
connection = sqlite3.connect('anekdot.db')
cursor = connection.cursor()
cursor.executescript("""create table anekdot(
        id int auto_increment primary key, anekdot longtext
    );""")
z=0
for _ in range(3000):
    z=z+1
    s=requests.get('http://anekdotme.ru/random')
    b=bs4.BeautifulSoup(s.text, "html.parser")
    p=b.select('.anekdot_text')
    for x in p:        
        s=(x.getText().strip())
        reg = re.compile('[^a-zA-Zа-яА-я .,!]')
        s=reg.sub('', s)
        cursor.execute("INSERT INTO anekdot (anekdot) VALUES ('"+s+"')")
        connection.commit()
    print(z)
connection.close()

Внутри скрипта все довольно банально - в цикле я получаю GET запросом очередные 30 анекдотов со страницы, и с помощью Beautiful Soup 4 ищу в них блок текста с классом .anekdot_text. Далее я получаю текст этого блока, чищу регулярным выражением от всех символов кроме букв и знаков препинания, и добавляю в БД.

Если будете запускать скрипт несколько раз, перед новым запуском сперва удаляйте файл anekdot.db иначе будет ошибка.

Итак, подождав около 4 часов, я получил файл anekdot.db который весит почти 50 мегабайт и содержит 90 тысяч анекдотов.

Подобным образом можно парсить анекдоты с любых сайтов где есть страничка со случайными анекдотами. Нужно только правильно задать класс блока HTML в котором лежит текст анекдота. Если указать в цикле значение больше чем 3000 можно получить базу не на 90 тысяч анекдотов, а гораздо больше. Но тогда, возможно придется добавить проверку на дубли.

Давайте попробуем написать пример скрипта на Python чтобы показать случайный анекдот из нашей базы. Положим его в один каталог с БД.

import sqlite3
import random
connection = sqlite3.connect('anekdot.db')
cursor = connection.cursor()
z=random.randrange(1,60000,1)
cursor.execute('SELECT * FROM anekdot WHERE rowid='+str(z))
row = cursor.fetchone()
print(str(row[1]))
connection.close()

При каждом запуске скрипт покажет нам случайный анекдот из спарсенной базы. Что делать с такой базой? Да что угодно - так как формат SQLi довольно хорошо поддерживается во всех языках программирования, можно создать себе на сайт виджет случайного анекдота с помощью PHP, запилить оффлайн-сборник анекдотов для Android или iOS.

Исходники скриптов можно скачать здесь

Данный материал подготовлен @pythono.

112
77.010 GOLOS
На Golos с August 2017
Комментарии (2)
Сортировать по:
Сначала старые