Найти - Пользователи
Полная версия: Парсинг поисковой выдачи Яндекс
Начало » Python для экспертов » Парсинг поисковой выдачи Яндекс
1
ArthurCher
Добрый день!
Начинаю разбираться с python. Возникла потребность сделать парсер поисковой выдачи Яндекс. Но Яндекс постоянно баннит запросы. При запросе страницы использую разные прокси и юзер-агенты, сделал задержку между запросами. Но Яндекс все равно баннит. Что можно еще сделать, чтобы обойти бан и спарсить выдачу? Собственно код ниже:
 from bs4 import BeautifulSoup as BS
import requests
from random import choice
from time import sleep
from random import uniform
user_agents = []
proxies = []
query = input("Введите поисковый запрос -> ")
ver_query = query.replace(' ', '%20')
url = 'https://yandex.ru/search/?lr=213&text=' + ver_query
print(url)
with open('user_agents.txt', 'r') as file:
    for line in file.readlines():
        user_agents.append(line.replace('\n', ''))
with open('proxy_list.txt', 'r') as file:
    for line in file.readlines():
        proxies.append(line.replace('\n', ''))
while True:
    sleep(uniform(3, 6))
    ua = choice(user_agents)
    ip_proxy = choice(proxies)
    user_agent = {'User-Agent': ua}
    proxy = {'http': 'http://' + ip_proxy}
    try:
        print('Прокси -> ', ip_proxy)
        print('User-Agent -> ', ua)
        url_proxy = requests.get(url, headers=user_agent, proxies=proxy)
        soap_proxy = BS(url_proxy.content, 'html.parser')
        place = 1
        with open('content.txt', 'w') as yandex:
            yandex.write(soap_proxy.prettify())
        if soap_proxy.find('p', class_='text-wrapper text-wrapper_info'):
            print("Этот прокси забанен, выбираем другой")
            continue
        else:
            for link in soap_proxy.findAll('a', class_='link link_theme_normal organic__url link_cropped_no i-bem'):
                with open('result.txt', 'a') as result_file:
                    str_result = str(place) + ' -> ' + link.get('href') + '\n'
                    result_file.write(str_result)
                place += 1
            print("Выдача спарсена")
            break
    except:
        print("Faile")
        continue
py.user.next
Надо подумать над тем, как Яндекс определяет близость запросов друг к другу. Заменять User-Agent и менять айпишник, да ещё и на общедоступный прокси-сервер, - это как-то тупо. Очень легко написать алгоритм, который это заметит и поставит под подозрение. Вот проанализируй, как Яндекс отлавливает таких “умников” типа. Но сам Яндекс тоже не верх гениальности, так что обойти его проверку можно.
ArthurCher
Прокси я покупаю, бесплатные не использую. При чем один раз получилось спарсить - потом Яндекс начал банить. Заливал новые платные прокси - все равно банил. Яндекс точно не верх гениальности, у них все через одно место работает. Но подскажите, как анализировать, куда смотреть и что искать?
ZerG
Может написать в сам янекс?
py.user.next
ArthurCher
При чем один раз получилось спарсить
Проанализируй, как это получилось.

У них там используются нейронные сети, потому что таких умников дофига вообще-то, и человек, даже куча человек, заманается всё это просматривать. Возможно, там комбинированная хрень: нейронная сеть детектирует первый слой и передаёт уже конкретные случаи живым людям, которые принимают решение о включении в список подозрительных (при чёрном списке) либо вытаскивают его в список разрешённых (при белом списке).

При таком раскладе, в том случае, когда у тебя получилось, ты прошёл проверку нейронной сети, но не прошёл проверку человеком - то есть такой более умной нейронной сетью. Значит, ты что-то всё равно делал тупо. Вот найди это и исправь.
Rodegast
> Возникла потребность сделать парсер поисковой выдачи Яндекс. Но Яндекс постоянно баннит запросы.

Не пробовал использовать API яндекса?
ArthurCher
API Яндекса дает XML выдачу - она сильно отличается от реальной. Вопрос именно парсинге реальной живой выдачи.
ZerG
Может написать в сам янекс?

Они отправят в сервис Яндекс.XML - они не любят когда их парсят, будь то любой их сервис.

py.user.next
Оказалось все намного проще и тупее. Нужно просто выдерживать больший тайминг между обращениями. Я слишком часто стучался в выдачу. Нейронки они конечно используют, но крайне не умело.
py.user.next
ArthurCher
Нужно просто выдерживать больший тайминг между обращениями.
Далеко не факт, что за тобой не следят. Может, накапливают профиль, который при достижении порогового значения будет заблокирован.

ArthurCher
Нейронки они конечно используют, но крайне не умело.
Главная фишка нейронной сети в том, что она срабатывает не сразу, а сначала учится долго, а потом, научившись, работает быстро и надёжно. Так что вполне возможно, что за тобой стали следить и ты сейчас в качестве кролика подопытного используешься нейронной сетью для самообучения, что впоследствии создаст целый класс моделей, описывающих таких, как ты, и потом автоматом это всё будет блокироваться даже для тех, кто ещё ни разу ничего не делал.

Так что месяцок пособирай данные так. И вот тогда можешь говорить, что преодолел их защиту.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB