1045
Чат создан чтобы делиться опытом о Scrapy/Python и другими парсинг технологиями. Вежливость и уважение к другим участникам группы. Троллинг не приветствуется. FAQ: https://github.com/bulatbulat48/ru-scrapy-python Работа: t.me/scrapy_jobs
Доброго времени суток. Подскажите куда глядеть. На сайте 10 категорий, в каждой разное количество товаров. Если меньше 100, получаю все, если больше, то только 100. 🫤
Читать полностью…
типа получить данные и проверить значения в определенных полях .
например поля которые проверяю должны быть int или строка или json строка. или диапазон инта 10 - 100
Доброго. Кто пишет тесты для пауков ? Толкните в нужном направлении)
Читать полностью…
Более правильно было бы ставить вручную именно asyncio реактор, а не дефолтный
В мастере это всё уже неактуально, если будет 2.13.2 то попробую не забыть
да ни в каком, это прототип, один под своим ип второй через впн
Читать полностью…
А как ее решать селениумом?
Вот вижу капчу, могу сохранить скриншот, как правильно прокрутить ее)
Судя по всему это играет не маловажную роль. Избавится навряд ли получится потому что засрать можно любую белую прокси
Читать полностью…
cap.guru решает. А дальше смотрите частоту выскакивания / профит от парсинга
Читать полностью…
попробовал ради прикола прогнать w3lib через mypyc, всё с первого раза скомпилилось, но прироста в скорости, по крайней мере в тестах, никакого)
Читать полностью…
Может стоит еще ссылку добавить, а то выходит гадание на кофейной гуще)
Читать полностью…
это всё спайдермоном делается конечно, но спайдермон про прод, а не про тесты
Читать полностью…
https://docs.scrapy.org/en/latest/topics/contracts.html возможно
Читать полностью…
(наша ошибка была в отсутствии тестов на сниппеты с CrawlerRunner)
Читать полностью…
Поменять бы код в доках https://doc.scrapy.org/en/latest/topics/practices.html для Same example but running the spiders sequentially by chaining the deferreds на более правильный, или заметку какую приписать, а то если начиная со scrapy 2.13.0 не выставить в TWISTED_REACTOR=None (из-за теперешнего The asyncio reactor is now enabled by default), все ломается с этими @defer.inlineCallbacks и reactor.run(), reactor.stop() (как минимум под win10, но думаю os тут не особо влияет).
Яндух кроме всего прочего генерацию canvas проверят. У серверов, обычно, нет видюх, значит canvas CPUшный. Соответственно, он легко отличимый от среднестатистического компа пользователя. Рашать капчу - нет никаких проблем.
Читать полностью…
Спасибо, но вопрос скорее про то, как модифицировать селениум скрипт/какое прокси купить, чтобы такая капча не выскакивала (или выскакивала редко)
на моем компе ее нет (тестировал скрипт больше часа)
Да, возможно
Уже покупал прокси на сайте proxy-seller.io
но сатло еще хуже - даже на моем компе сразу вылезает сложная капча
Привет посоветуйте, пожалуйста, настройки селениума / сервсис прокси, чтобы парсить яндекс
https://stackoverflow.com/questions/79626509/how-to-improve-selenium-script-so-that-the-captcha-does-not-appear
На моей ноутбуке скрипт работает прекрасно (в headless режиме) - выскакивает только чекбокс "Я не робот", успешно его решаю
Но на сервере скрипт получает вот такую капчу (приложил фото)
Все привет
Делаю небольшую автоматизацию scrapy и playwright.
Мне нужно открыть страницу с капчей DadaDome я использую сервис 2captcha для её решения. Результат куков я вставляю таким образом.
async def _apply_solution(self, data: dict, captcha_url: str) -> None:
cookie_str = data['code']
name, rest = cookie_str.split("=", 1)
value = rest.split(";", 1)[0]
print(cookie_str)
# парсим Max-Age
m = re.search(r"Max-Age=(\d+)", cookie_str, re.IGNORECASE)
max_age = int(m.group(1)) if m else None
# вычисляем UNIX-время истечения
expires = int(time.time()) + max_age if max_age is not None else None
host = urlparse(self._page.url).hostname
domain = "." + ".".join(host.split(".")[-2:])
cookie = {
"name": name.strip(),
"value": value.strip(),
"domain": domain,
"path": "/",
"httpOnly": False,
"secure": True,
"sameSite": "Lax",
}
# только если парсинг Max-Age удался — добавляем expires
if expires is not None:
cookie["expires"] = expires
geo_cookie = cookie.copy()
geo_cookie["domain"] = "geo.captcha-delivery.com"
# await asyncio.sleep(1000)
await self._page.context.add_cookies([cookie, geo_cookie])
# 3) теперь вернуться/перезагрузить исходную страницу — DataDome пропустит вас
await self._page.goto(self._page.url, wait_until="networkidle")
их сбрасывает и получаю «скрин».