Задать вопрос
SerhiyRomanov
@SerhiyRomanov
Программист и WEB-разработчик

Парсинг Яндекс.Поиск — как отправить каптчу?

Нужно получить ссылки с поисковой выдачи Яндекс.
Говорю сразу - про Яндекс.XML знаю, но нужна именно "живая" выдача

Все прекрасно, пока не появляется капча.
PROXY_HEADERS = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) '
                               'Ubuntu Chromium/55.0.2883.87 Chrome/55.0.2883.87 Safari/537.36',
                 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
                 'Accept-Encoding': 'gzip, deflate',
                 'Accept-Language': 'en-US,en;q=0.8,uk;q=0.6,ru;q=0.4',
                 'Cache-Control': 'no-cache',
                 'Connection': 'keep-alive',
                 'Pragma': 'no-cache',
                 'Upgrade-Insecure-Requests': '1'
                 }
s = requests.Session()
s.headers = PROXY_HEADERS

is_captcha = True
while is_captcha:
    current_url = "https://yandex.ru/search/?text={}&p={}".format(search, start)
    
    page = s.get(current_url)
    parsed = html_parser.document_fromstring(page.text)

    # Если есть капча
    if parsed.cssselect('.form__captcha'):
        is_captcha = True

        captcha_src = parsed.cssselect('.form__captcha')[0].get('src')
        solved_captcha = get_solved_captcha(captcha_src, s) # капча разгадывается верно - проверял
        key = parsed.cssselect('.form__key')[0].get('value')
        retpath = parsed.cssselect('.form__retpath')[0].get('value')

        c_url = "http://yandex.ru/checkcaptcha"
        req_c = s.get(c_url, params={'key': key, 'retpath': retpath, 'rep': solved_captcha})
       # И тут в ответ всегда получаю 200 ответ и страницу ввода капчи еще раз.
    else:
        is_captcha = False


Кто имел с этим дело? Подскажите, что я делаю не так(
  • Вопрос задан
  • 5353 просмотра
Подписаться 5 Оценить Комментировать
Решения вопроса 1
@g00dv1n
Можно попробовать взять selenium webdriver. И с реального браузера отправлять запросы..Тогда капчка должна реже появлятся.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
dummyman
@dummyman
диссидент-схизматик
Во первых, Хром, Хромиум, Сафари посылают уникальный id запроса в заголовочниках, как User-Agent лучше использовать Фаирлис. А в остальном могу лишь посоветовать скриптовые браузеры CasperJS, PhantomJS или SlimerJS. Они по-идее глубже эмулируют процесс человекоприсутствия

Вот например парсинг выдачи гугла
docs.casperjs.org/en/latest/quickstart.html
Ответ написан
Комментировать
dimonchik2013
@dimonchik2013
non progredi est regredi
капча суется боту

нужно прикинуться не ботом
Ответ написан
@devel787
Где-то в условиях пользования поиском от Яндекса явно написано, что парсить этот сайт запрещено.
Так что вы всё делаете "не так" и Яндекс будет активно вам противодействовать.
Ответ написан
Комментировать
herypank
@herypank
Недавно столкнулся с похожей проблемой и решил записать для обычных смертных небольшую подсказку. Я потратил день чтобы разобрать.

1. В респонсе должна придти капча, если приходит обрабатывай.

response.url

2. Переходишь на этот урл и тыкаешь на кнопку я не робот через POST запрос(Мне помог Burp Suite)
resp = requests.get(capture_url)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, 'lxml')
url_part = soup.select_one('form.CheckboxCaptcha-Form').get('action')
link_for_post = urljoin(current_url, url_part)
resp_post = requests.post(link_for_post) #  Тут должна быть сама капча

3. Достаешь ссылку на капчку и проходишь её через https://rucaptcha.com/software/python-rucaptcha

Что я использовал
1) https://docs.python-requests.org/en/master/ - Для запросов
2) https://docs.python-requests.org/en/master/ - Для парсинга капчи
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы