Парсер поисковой выдачи на Python

Парсер поисковой выдачи на Python

Недавно я решил сделать программу, которая бы более менее внятно отвечала на поисковые запросы, получая тексты статей из поисковой выдачи, и очищая их от лишней информации вроде тегов, скриптов и лишних блоков на страницах. Результат в принципе можно считать успешным. Созданная программа парсит выдачу поисковика go.mail.ru и вытаскивает текст статей из сайтов поисковой выдачи по запросу полученному от пользователя. Выглядит это все очень просто - программа просит пользователя ввести вопрос - и взамен выдает несколько текстов с информацией по теме. Я работал именно с поисковиком от Mail.ru поскольку он не считает программу роботом и не создает препятствия вроде ввода капчи. Парсер поисковой выдачи на Python Для парсинга сперва нужно установить библиотеку html2text $ pip install html2text Собственно, сам код программы с комментариями:

import re, sys
import urllib.request
from urllib import request
from urllib.parse import quote
import html2text

# Введем поисковый запрос и получим в переменную doc страницу с поисковой выдачей от mail.ru

print("\n---------\n")
z=input("Введите ваш вопрос: ")
print("\n---------\n")
s = 'http://go.mail.ru/search?fm=1&q='+quote(z)
doc = urllib.request.urlopen(s).read().decode('cp1251',errors='ignore')

# В список sp получим все ссылки на результаты поиска из этой страницы

o=re.compile('"url":"(.*?)"')
l=o.findall(doc)
sp=[]
for x in l:
    if((x.rfind('youtube')==-1) and(x.rfind('yandex')==-1) and(x.rfind('mail.ru')==-1) and(x.rfind('.jpg')==-1) and(x.rfind('.png')==-1) and(x.rfind('.gif')==-1)):
        sp.append(x)

sp = dict(zip(sp, sp)).values()

for s in sp:
    try:
        # Теперь будем по очереди получать тексты каждой страницы из результатов поиска в переменную doc
        doc = urllib.request.urlopen(s).read().decode('utf-8',errors='ignore')
        h = html2text.HTML2Text()
        h.ignore_links = True
        h.body_width = False
        h.ignore_images = True
        doc = h.handle(doc)
        summa=""
        # Делим текст страницы на абзацы
        ss=doc.split("\n")
        for xx in ss:
            xx=xx.strip()
            # Фильтруем абзацы чтобы они не начинались неправильными символами а кончались на правильные - точку или !?;
            if((len(xx)>50) and (xx.startswith('&')==False) and (xx.startswith('>')==False) and (xx.startswith('*')==False) and (xx.startswith('\\')==False) and (xx.startswith('<')==False) and (xx.startswith('(')==False) and (xx.startswith('#')==False) and (xx.endswith('.') or xx.endswith('?') or xx.endswith('!') or xx.endswith(';'))):
                summa = summa + xx + "\n \n"
        if(len(summa)&rt;500):
            print(summa+"\n----------------------------------------\n")
    except Exception:
        pass

Работает парсер следующим образом - сперва дает запрос к поисковику Mail.ru и получает в ответ Html код страницы с результатами поиска. Эта страница парсится регулярным выражением на поиск ссылок на сайты из результатов поиска. Составленный список ссылок по очереди проходится - программа заходит на каждую страничку из списка и выкачивает её html код. Далее этот код с помощью html2totext преобразуется в обычный текст очищенный от тегов. В получившемся тексте берутся только достаточно длинные абзацы, заканчивающиеся на точку, восклицательный или вопросительный знак или точку с запятой. Такой несложной фильтрации обычно хватает чтобы выделить из всего текста собственно статью с нужной информацией. Данный парсер выдает в консоль сразу все тексты из первой страницы поисковой выдачи, иногда получается довольно длинный текст. Практическое применение данного кода - можно сделать аналог голосового ассистента, который может отвечать на вопросы, если скрестить данный код программы с голосовыми технологиями. Кроме того этот код позволяет быстро получать нужную информацию о чем угодно, что может быть использовано в самообучающихся системах для самостоятельного получения ими информации.

Парсер поисковой выдачи на Python Лого Pythono.ru Парсер поисковой выдачи на Python