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

Парсинг данных средствами 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. Исходники скриптов можно скачать здесь

Парсинг данных средствами Python Лого Pythono.ru Парсинг данных средствами Python

Если у вас есть Android телефон, вы можете скачать наш учебник по Python