Найти - Пользователи
Полная версия: Как автоматизировать парсинг на сайте с защитой от роботов?
Начало » Data Mining » Как автоматизировать парсинг на сайте с защитой от роботов?
1 2
Djo0513
Имеем большой проект который должен по заданному промежутку времени парсить один сайт на котором обновляется информация. Сайт имеет капчу, но выдаёт её только если узнает что пользователь робот. 4 день мучаюсь, никак не могу понять как автоматизировать скрипт. В headers писал всё и по отдельности и так и сяк. Ставил долгие time.sleep'ы. В книге Р.Митчелла сказано, что можно обойти защиту с помощью headers, но мне нужно делать это постоянно, а сайт рано или поздно “палит” робота. Пытался с перебором hedaers в списке для каждой страницы, не помогло. Есть ли решение вообще?
py.user.next
Djo0513
В headers писал всё и по отдельности и так и сяк.
Что писал в заголовках? Да и вручную через браузер выдаёт ли капчу?
Djo0513
py.user.next
Вручную не выдаёт, у него проверка на бота и после редирект что ли, на сайт, а если робот то на капчу. В заголовках писал очень много всего, даже на мозилу расширение скачал для проверки отправленных заголовков браузером и оттуда тупо копировал.
py.user.next
Обычно все эти проверки базируются на заголовках.

Djo0513
Вручную не выдаёт, у него проверка на бота и после редирект что ли, на сайт, а если робот то на капчу.
Скорее всего, что-то не дописал ты в заголовках или послал неправильное (время там или закодированный адрес IP).

Djo0513
В заголовках писал очень много всего
Пример заголовков сюда скопируй.
Djo0513
py.user.next
 import requests
from pprint import pprint
from bs4 import BeautifulSoup
import re
import time
import random
import csv
#proxies = [{'http': 'http://213.149.105.12:80'}, {'http': 'http://09.111.235.90:80'}, {'http': 'http://52.42.192.151:80'}, {'http': 'http://88.159.43.160:80'}]
def crauler(headers):
    time.sleep(30)
    response = requests.get(
        'http://www.propertyguru.com.sg/singapore-property-listing/property-for-sale?market=residential&property_type_code[]=3A&property_type_code[]=3NG&property_type_code[]=3Am&property_type_code[]=3NGm&property_type_code[]=3I&property_type_code[]=3Im&property_type_code[]=3S&property_type_code[]=3STD&property_type=H&freetext=Queenstown&hdb_estate[]=20&ps=1', headers=headers)
    time.sleep(20)
    bsobj = BeautifulSoup(response.text, 'lxml')
    time.sleep(20)
    target = bsobj.find('div', class_='listing-list listings-page-results enabled-boost')
    print(bsobj)
    for i in target.findAll('div', class_='row'):
        print(i.a['title']+'\n\n')
        for li in i.find('li', class_='lst-sizes'):
            print(li)
def main():
  spisok = [{"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0",
               'Host': 'www.propertyguru.com.sg',
               'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate'}, {}] #  Писал сюда много чего, после удалил, так как менял способ
   for i in spisok:
    crauler(i)
  
main()

Это то что осталось, так как много чего удалял, изменял и т.д. Но делал и другими способами тоже - не помогло.
py.user.next
Djo0513
Вручную не выдаёт
Вручную выдаёт капчу после трёх раз. Быстро обновляешь страницу и выдаёт.
Djo0513
py.user.next
Так я же поставил длительные time.sleep'ы, всё равно палит
Djo0513
  time.sleep(20)
    bsobj = BeautifulSoup(response.text, 'lxml')
    time.sleep(20)[/quote]
py.user.next
Ну я в браузере обновил с паузой в 1 минуту, точно так же капчу выдаёт после третьего раза.
Djo0513
py.user.next
Слишком длинные time.sleep'ы не мой конёк, этот скрипт в проекте значимую роль не играет. А через прокси ломаться будет, что делать?
py.user.next
Djo0513
Сайт имеет капчу, но выдаёт её только если узнает что пользователь робот.
Так ты руками сначала всё сделай, чтобы вообще понять, как без капчи это пройти. Там вообще может быть так, что капча всегда выдаётся. Дальше, если она не всегда выдаётся, надо понять, как они её сделали и на что она там реагирует. Она может реагировать вообще не на заголовки, а на профиль поведения клиента (ну типа переключает он ссылки или сидит на одной, заходил он за день до этого или не заходил, устраивал он раньше подозрительные действия или не устраивал). Временные проверки редко делают, только на не свойственные для человека скорости. На длинные паузы проверки не делают, потому что тут скорость интернета влияет: из-за неё может всё варьироваться и быть непонятным; нельзя гарантировать, какой у клиента интернет канал, его реальную скорость просто не определишь. Поэтому пройди это руками, там у него ещё печенье есть, оно тоже может учитываться при профилировании. Сначала докажи, что оно вообще проходимо вручную.
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