Ответы пользователя по тегу Парсинг
  • Выбор: парсить на питоне с aiohttp, asyncio, bs4 или requests + bs4?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Помогите разложить это по полочкам.

    Зависит от задачи:
    1. aiohttp + asyncio - выполнение асинхронных http запросов, без блокировки основного потока. Когда надо спарсить множество страниц без защиты, а времени в обрез.
    2. requests + bs - выполнение синхронных http запросов, с блокировкой основного потока. Когда надо спарсить несколько страниц без защиты, и время не жмет.
    3. selenium - когда первые 2 легли на первой же "защите на дурака". Синхронно, медленно, ресурсоёмко, максимальная человечность.
    Ответ написан
    6 комментариев
  • Как парсить сайты на Wordpress в определённой доменной зоне?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Это должно быть что-то вроде робота, которые будет переходить от сайта к сайту по внутреннем ссылкам

    Что это за сайты, которые ставят ссылки на своих конкурентов? Исключая ссылки на источник.
    или лучше сделать парсинг поисковой выдачи

    Поисковой. Затем по косвенным признакам определять, используется ли wp или не.
    (но как тогда сделать выдачу максимально разнообразной, ведь у меня нет конкретного поискового запроса?)?

    - Спарсить из вордстата.
    - Спарсить из поисковых подсказок.
    - Придумать.
    Ответ написан
    Комментировать
  • Как сопоставлять товары при парсинге?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    0. Тренируем нейронку распознавать товары, материалы по Вашей теме:
    0.1. https://habr.com/ru/companies/stm_labs/articles/708608/
    0.2. https://new-retail.ru/business/e_commerce/price_ru...
    0.3. Сравнение текстовых описаний через методы обработки естественного языка (NLP), такие как TF-IDF, word2vec, BERT для извлечения смысла и семантического сравнения текстов (Spacy, Hugging Face Transformers и другие библиотеки NLP для анализа текста).
    0.4. Анализ изображений товаров с помощью сверточных нейронных сетей (CNN), которые могут выявлять визуальные сходства между изображениями товаров, даже если они отличаются углом съемки, освещением или масштабом (OpenCV и TensorFlow).
    0.5. Графовые базы данных и алгоритмы, которые могут использоваться для идентификации связей между товарами на основе их атрибутов и отношений.
    1. Нейронка из п0. распознает товары.
    2. Человек в случайном порядке проверяет работу нейронки из п1. и при необходимости, сообщает ей её ошибки. Таким образом происходит дообучение нейронки уже в процессе работы.

    Либо, использовать поисковые движки (с его возможностями полнотекстового поиска и сопоставления), по типу Elasticsearch или OpenSearch (получая наибольшую вероятность сопоставления).
    Ответ написан
    5 комментариев
  • Парсер парсит только первые 5 URL картинок, а дальше /app/static/media/no_thumbnail.c222b0530.svg, что делать?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    requests парсит лишь первый ответ сервера и не может в динамический контент.
    что делать?

    Не использовать requests для парсинга, а использовать selenium.
    Ответ написан
  • При парсинге выдает ошибку 503. В чем может проблема?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    При парсинге выдает ошибку 503. В чем может проблема?

    В данном исполнение - никак. requests возвращает html, который сервер вернул при первом запросе, а сервер первым возвращает 503 ответ, затем js loader (загрузку), а уже затем необходимую страницу.
    КартинкО
    65fbd419a63e3055208155.png

    Буду рад, если распишите более подробно, как обходить данную ошибку.

    В данном случае - использовать selenium + undetected_chromedriver/selenium-stealth.
    Я сильно сомневаюсь, что этот сайт без антибот защиты

    MagicMight прав, а DmitriyKLN еще придется с этой защитой столкнуться.
    Ответ написан
    1 комментарий
  • Составить карту для парсинга и автоматизации ставок?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Планирую сделать парсер букмекерской конторы

    подскажите какие темы нужно поучить

    Selenium
    selenium-stealth (это букмекеры, Вы у них не первый, а значит броня прокачена).
    есть начальные знания питона, остановился на списках, кортежах и тп

    Это не начальные знания, начальные знания - это весь python (от корки до корки), с малым количеством написанного кода.
    Ответ написан
    3 комментария
  • Как отрисовать страницу для парсинга?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Как срендерить весь javascript для парсинга?

    Использовать selenium.
    Selenium WebDriver Chrome слишком долго прогружает, ещё и палиться как Вебдрайвер.

    Обновите железо, используйте selenium stealth.
    Ответ написан
    Комментировать
  • Имитация действий пользователя на сайте?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Существует ли способ имитировать эти действия так, чтобы JavaScript успешно их распознавал

    Написать на python + selenium алгоритм движение курсора (например, используя кривые безье и катмулл рома, классическую линейную интерполяцию + добавить шума) мыши по координатам, чтобы оно выглядело наиболее "человечным".
    Существует ли способ имитировать эти действия так, чтобы JavaScript успешно их распознавал, но без использования библиотеки PyAutoGUI или аналогичных, которые контролируют реальный курсор?

    Всего 2 варианта:
    - Запускать selenium в headless режиме, тогда не будет визуального окна и курсор мыши не будет перемещаться "в никуда", хотя для js на этом сайте все будет выглядеть "человечно".
    - Запускать selenium без headless режима, тогда курсор будет перемещаться в указанную область окна браузера.
    Ответ написан
  • Как запарсить страницу?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Может ли на hh.ru стоять какая-то защита от парсинга?)

    Самая примитивная, которая чекает заголовки:
    import requests
    from bs4 import BeautifulSoup
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
        'Accept-Language': 'en-US,en;q=0.9',
        'Accept-Encoding': 'gzip, deflate',
        'Connection': 'keep-alive',
    }
    
    res = requests.get('https://tomsk.hh.ru/article/31475', headers=headers)
    
    if res.status_code == 200:
        soup = BeautifulSoup(res.text, 'html.parser')
        el = soup.find('div', class_='URS-ratingTable')
    
        if el:
            print(el)
        else:
            print('Table not found!')
    else:
        print('The problem with connecting to the website', {res.status_code})
    Ответ написан
    Комментировать
  • Как нажать кнопку на сайте пика через селениум?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Как нажать кнопку на сайте пика через селениум?

    4.6. Locating Elements by Class Name

    Вместо By.CLASS_NAME (можно передать лишь 1 наименование класса), используйте By.CSS_SELECTOR (можно передать любой селектор):
    # pahe = driver.find_element(By.CLASS_NAME, 'sc-gsnTZi fWJuXR').click()
    pahe = driver.find_element(By.CSS_SELECTOR, '.sc-gsnTZi.fWJuXR').click()


    И, если есть минутка - на скок понял это проверка сертификатов - как это поправить можно? (куда посмотреть)
    [8468:12460:0214/095050.752:ERROR:ssl_client_socket_impl.cc(974)] handshake failed; returned -1, SSL error code 1, net_error -101
    [8468:12460:0214/095050.866:ERROR:ssl_client_socket_impl.cc(974)] handshake failed; returned -1, SSL error code 1, net_error -101

    Проблемы с ssl соединением (handshake failed).
    Ответ написан
    Комментировать
  • Как сделать скрин отрывка в Selenium Python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Сохраняем скрин всей страницы, затем вырезаем нужное из этого скрина:
    $ pip install --upgrade webdriver-manager
    $ pip install Pillow

    from selenium import webdriver
    from selenium.webdriver.edge.service import Service
    from PIL import Image
    from webdriver_manager.microsoft import EdgeChromiumDriverManager
    
    driver = webdriver.Edge(service=Service(EdgeChromiumDriverManager().install()))
    driver.get("https://pillow.readthedocs.io/en/stable/installation.html")
    path = "full.png"
    driver.save_screenshot(path)
    driver.quit()
    
    x = 100
    y = 100
    w = 500
    h = 300
    
    image = Image.open(path)
    cropped = image.crop((x, y, x+w, y+h))
    cropped.save("crop.png")

    КартинкО

    65cc62a645be7633087189.png
    65cc62ac23be7654822496.png
    65cc62b0ef884076037417.png

    Но обычно отправляют сразу изображение капчи (оно обычно в html в style как base64 вставлено), ничего не вырезая.
    Ответ написан
    2 комментария
  • Ошибка 403 при парсинге сайта?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Обнаружил некую защиту "на лоха", а значит request и обычный selenium не справятся, буду использовать selenium + selenium-stealth (пример от сюда) + chrome + socks5 (рабочий, на момент теста):
    import time
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.chrome.options import Options
    from selenium_stealth import stealth
    
    proxy = '45.132.75.19:23820'
    
    options = Options()
    options.add_argument('--proxy-server=socks5://' + proxy)
    options.add_argument("--disable-blink-features=AutomationControlled")
    options.add_argument("window-size=1920,1080")
    # options.add_argument("--incognito")
    options.add_argument("--disable-extensions")
    options.add_argument("--disable-plugins-discovery")
    options.add_argument("--start-maximized")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    
    executable_path = './chromedriver-121.0.6167.85.exe'
    
    service = Service(executable_path=executable_path)
    driver = webdriver.Chrome(service=service, options=options)
    
    stealth(driver,
            languages=["en-US", "en"],
            vendor="Google Inc.",
            platform="Win64",
            webgl_vendor="Intel Inc.",
            renderer="Intel Iris OpenGL Engine",
            fix_hairline=True,
            run_on_insecure_origins=True,
            user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.85 Safari/537.36',
            )
    
    try:
        driver.get('https://allegro.pl/kategoria/laptopy-491')
        time.sleep(30)
        print(driver.page_source)
    finally:
        driver.quit()

    Chromedriver качать здесь, он должен совпадать с мажорной версией Вашего Chrome браузера, который будет использовать Selenium.

    65c1e056ad6db620469150.png
    Ответ написан
    Комментировать
  • Как забрать html код со страницы?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Пытался забрать html простым реквестом, получалась не очень

    попробовал через selenium - получил то же самое

    Не spa, не ajax и защиты нет, а значит request вполне справится, ниже рабочий пример, который печатает всю html страницу (российские ip блочат (403), использовал рабочий socks5):
    import requests
    import socks
    import socket
    
    socks.set_default_proxy(socks.SOCKS5, "45.56.219.55", 52759)
    socket.socket = socks.socksocket
    
    url = 'https://www.skiddle.com/festivals/dates.html'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
    
    try:
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()
        print(response.text)
    
    except requests.exceptions.HTTPError as errh:
        print("Http Error:", errh)
    except requests.exceptions.ConnectionError as errc:
        print("Connecting Error:", errc)
    except requests.exceptions.Timeout as errt:
        print("Timeout Error:", errt)
    except requests.exceptions.RequestException as err:
        print("Other Error", err)

    print(response.text)

    <!DOCTYPE html>
    <!--[if lt IE 7]><html class='ie ie6 lte9 lte8 lte7 no-js'> <![endif]-->
    <!--[if IE 7]><html class='ie ie7 lte9 lte8 lte7 no-js'> <![endif]-->
    <!--[if IE 8]><html class='ie ie8 lte9 lte8 no-js'> <![endif]-->
    <!--[if IE 9]><html class='ie ie9 lte9 no-js'> <![endif]-->
    <!--[if gt IE 9]><html class='ie no-js'><![endif]-->
    <!--[if !IE]><!--> <html class='no-ie no-js' lang='en'><!--<![endif]-->
    
    <head><!-- Basic Page Needs
    ================================================== -->
    <title>A-Z of Future Festivals</title>
    <link rel="manifest" href="/manifest.json">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><!-- DNS Prefetching
    ================================================== -->
    
    
    
    
    <link rel="preconnect" href="https://d31fr2pwly4c4s.cloudfront.net"/>
    <link rel="preconnect" href="https://d1plawd8huk6hh.cloudfront.net"/>
    <link rel="preconnect" href="https://www.google-analytics.com" />
    
    
    <link rel="preload" href="https://d1plawd8huk6hh.cloudfront.net/css-responsive2/fonts/BuenosAires/BuenosAiresWeb1-Regular_gdi.woff2" as="font" type="font/woff2" crossorigin="anonymous">
    <link rel="preload" href="https://d1plawd8huk6hh.cloudfront.net/css-responsive2/fonts/BuenosAires/BuenosAiresWeb1-Bold_gdi.woff2" as="font" type="font/woff2" crossorigin="anonymous">
    
    
    <link rel="dns-prefetch" href="https://d31fr2pwly4c4s.cloudfront.net"/>
    <link rel="dns-prefetch" href="https://d1plawd8huk6hh.cloudfront.net"/>
    <link rel="dns-prefetch" href="https://www.google-analytics.com" />
    <link rel="dns-prefetch" href="//connect.facebook.net" />
    <link rel="dns-prefetch" href="//www.googleadservices.com" />
    <link rel="dns-prefetch" href="//www.stay22.com" />
    <link rel="dns-prefetch" href="//api.stay22.com" />
    <link rel="dns-prefetch" href="//skiddle.imgix.net" />
    <link rel="dns-prefetch" href="//skiddleartists.imgix.net" />
    
    <!-- CSS
    ================================================== -->
    
    <meta property="fb:app_id" content="102483650494"/>
    <meta http-equiv="x-dns-prefetch-control" content="on"/>
    <meta name="insight-app-sec-validation" content="5574b896-289f-48c0-aebb-98730b831151">
    
    <!-- Mobile Specific Metas
    ================================================== -->
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    ...

    Ответ написан
  • Как спарсить сайт, требующий авторизацию с кодом из смс?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Какие есть способы для решения задачи (желательно из ЯП использовать python)

    Желательно - это "не обязательно".
    Тинькофф сбрасывает любые сессии каждые 12 часов

    Вполне ожидаемо для сервиса, работающего с деньгами.
    Проблемы возникают на моменте ввода кода из смс, как его можно перенаправить серверу?

    - Получать смс на временный номер, используя специализированные сервисы с api.
    - Поставить на телефон приложение, которое будет перехватывать определенные смс и слать их указанным образом по указанному адресу, например SMS forwarder или SMS Backup & Restore.
    - Написать свое приложение (если не доверяете чужим), которое сделает все тоже самое, что пункт выше, но здесь будет использоваться не python, а kordova/react-native/flutter/kotlin.
    Ответ написан
    Комментировать
  • Как через xpath достать язык страницы?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Как через xpath достать язык страницы?

    Если в html имеется атрибут lang, то можно получить его значение: /html/@lang
    Ответ написан
    Комментировать
  • Как импортировать товары с чужого сайта Wordpress на свой wp?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Как импортировать товары с чужого сайта Wordpress на свой wp?

    Использовать готовые плагины WP для парсинга, например:
    WP Content Crawler
    Scrapes
    С wp работаю первый раз

    хотелось бы узнать у более опытных людей как это сделать «по человечески»

    Написать подробное тз и заказать на фрилансе.
    Ответ написан
  • Как проскролить страницу вверх при помощи puppeteer?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Можно крутануть саму страницу:
    await page.evaluate(() => {window.scroll(0,0)});

    Либо крутить колёсиком мыши:
    await page.goto(
      'https://mdn.mozillademos.org/en-US/docs/Web/API/Element/wheel_event$samples/Scaling_an_element_via_the_wheel?revision=1587366'
    );
    
    const elem = await page.$('div');
    const boundingBox = await elem.boundingBox();
    await page.mouse.move(
      boundingBox.x + boundingBox.width / 2,
      boundingBox.y + boundingBox.height / 2
    );
    
    await page.mouse.wheel({deltaY: -100});
    Ответ написан
    4 комментария
  • Как при парсинге на node js смотреть цвет шрифта?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    1. Перейти на страницу.
    2. Получить все элементы по селектору.
    3. В цикле обойти каждый элемент, выполняя код на странице, который получит и вернет цвет элемента, затем проверить на белый.
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('//some.com')
    
    const symbol = "₽";
    const xpathExpression = `(//span[contains(text(), '${symbol}')])`;
    const els = await page.$x(xpathExpression);
    
    for (const el of els) {
      const c = await page.evaluate(_el => {
        const s = window.getComputedStyle(_el);
        return s.color;
      }, el);
    
      if (c === 'rgb(255, 255, 255)') console.log('White is detected!')
    }
    
    await browser.close();
    Ответ написан
    Комментировать
  • Почему переменная all_participants принимает только 10000 значений, а не больше при парсинге?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Почему переменная all_participants принимает только 10000 значений, а не больше при парсинге?

    "Особенность" Telethon
    Ответ написан
    Комментировать