Ответы пользователя по тегу Парсинг
  • Как избавиться от ненужного тега(Beautifulsoup)?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    soup.find('a').find(text=True).strip()

    Либо через contents
    soup.find('a').contents[0].strip()
    Ответ написан
  • Как исправить ошибку 302 после отправки запроса к API?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Если посмотреть на location, то видно, что выкидывает на авторизацию. Куки вообще не так передаются.

    Сделайте из своих куки словарь имя-значение
    cookies = {'name': 'value', 'name2': 'value2'}
    и передайте их в запрос

    r = requests.get(url, cookies=cookies)
    Ответ написан
  • Как парсить историю продаж Steam?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Если просто - то можно просто вписывать дату начала и конца, и дальше перебором все вывести

    start = 'May 29 2014'
    end = 'Nov 07 2014'
    
    is_found = False
    
    for data in resp['prices']:
        if data[0].startswith(start):
            is_found = True
    
        elif data[0].startswith(end):
            is_found = False
            break
    
        if is_found:
            print(data[1])


    Если по сложному - импортируем datetime, преобразовываем дату в datetime объект, и точно так же итерируем через список, при этом сравнивая объекты даты нужными кусками
    from datetime import datetime
    
    start = datetime.strptime('May 29 2014', '%b %d %Y')
    end = datetime.strptime('Nov 07 2014', '%b %d %Y')
    Ответ написан
    2 комментария
  • Расширение таблицы при парсинге?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    В общем, рассказываю про парсинг.

    Код, который видно на странице через инспектор элементов в браузере - это код, который браузер подготовил для пользователя. Открываете сайт - браузер отправлять запрос на сервер. Запрос состоит из метода, пути, заголовков и тела. После первоначального запроса браузер получает от сервера HTML страницу, в которую включено (обычно) множество JS скриптов, которые в процессе выполнения могут создавать дополнительные запросы на сервер для получения дополнительной информации. После выполнения всех действий, пользователь видит в браузере готовый результат, который отличается от первоначального запроса из-за дополнительных джаваскриптов.

    Если элемент (класс, id, и тд) видно в инспекторе браузера - это не означает, что элемент присутствовал при первоначальном запросе. Чтобы увидеть тот код, который браузер получает первоначально (тот самый код, который вы получите через requests, curl итд) - нужно нажать CTRL+U, либо правой кнопкой -> просмотр кода страницы
    Это - тот самый код, который вы получаете, и все данные нужно искать только в нем, это дает гарантию того, что нужный вам элемент будет присутствовать при выполнении запросов через ЯП.

    Если нужного элемента нет на странице, значит он загружен каким нибудь JS скриптом. Здесь будут два варианта:
    1. JS отправляет дополнительный запрос на сервер, получает нужные данные и вставляет их в HTML.
    2. Данные создаются внутри JS скрипта без запросов (очень маловероятно)

    Если данные появляются в результате дополнительного запроса, то нужно просто повторить этот запрос.

    Чтобы понять, что нужно - нужно воспользоваться любым сниффером трафика. Самое простое - встроенный в браузер логгер запросов. F12 -> Network.
    6124fec4cfd69347854863.png
    Обычно достаточно поставить фильтр на XHR.
    Если есть под рукой Fiddler, то тоже сгодится. Ну и Burp / ZAP как вариант (но очень жирно).

    Алгоритм будет примерно таким:
    1. Открываем вкладку Network
    2. Очищаем историю запросов (если есть)
    3. Желательно поставить галочку "Preserve log", чтобы история не пропадала.
    4. Обновляем страницу. Если контент подгружается при прокретке / по нажатию кнопки - крутим / нажимаем и тд.
    5. Теперь можно нажать CTRL+F все в той же вкладке Network и вписать искомый текст (допустим название товара).
    6. Слева будут те запросы, которые содержат эту подстроку. Теперь нужно просто пощелкать по ним, найти нужный, посмотреть из чего он состоит и повторить его через requests.

    Нужно обратить внимание на заголовки и тело запроса. Не редко при загрузке доп. информации в тело запроса так же передается указатель текущей страницы, или индекс элемента, с которого начинается новый список. Так же в заголовки могут добавиться дополнительные. Например, csrf token, либо X-Requested-With. Если повторение запроса не принесло желанный результат - стоит проверить заголовки и тело еще раз. Если сайт загружает данные при нажатии на кнопки, прокрутке страницы и тд - алгоритм тот же.

    Делюсь хорошим сайтом, который увидел тут: https://curl.trillworks.com/
    Копируете свой запрос как CURL
    612500b91076a776091384.png
    Затем вставляете на сайт. Он выдаст готовый код на Python. Но нужно понимать, что это автоматический процесс и он не всегда выдает правильный результат. В частности, преобразование application/json тела довольно неправильно. Но для копипаста некоторых заголовков подходит вполне. В общем сайтом пользоваться можно, но и самому думать тоже нужно

    Из хороших программ - Postman. Позволит легко и быстро составлять запросы, есть экспорт в Python код. Советую, если запросы довольно тяжелые, чтобы составлять их "наживую".

    Краткая выжимка:
    1. Код через инспектор браузера != коду с запроса requests / curl.
    2. Скорее всего нужные вам данные подгружаются доп. запросами, ищутся через любой мониторинг трафика.
    3. Следите за телом и заголовками запроса. Заголовки, даже самые незначительные, могут влиять на конечный результат.
    4. Старайтесь всегда в заголовки добавлять User-Agent

    Если данные грузятся без доп запросов, лежат в неизвестном формате, или просто лень разбираться - используйте Selenium. Он является таким же браузером, но только с возможностью контролировать его работу
    Ответ написан
    3 комментария
  • Проблема перехода со страници на страницу при парсинге?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Переход по страницам осуществляется не через параметр "page", а путем редактирования uri.

    def parse():
    
        url = 'https://rezka.ag/page/{}/?filter=last&genre=1'
    
        muviee = []
    
        for page in range(1, pages+1):
            print('Парсинг страницы', page, 'из', pages)
    
            r = get_html(url.format(page))
    
            if r.status_code == 200:
                muviee.extend(get_content(r.text))
    
                print('Получено', len(muviee), 'фильмов')
    
            else:
                print('Error')
    Ответ написан
    6 комментариев
  • Почему BeautifulSoup.find_all() возвращает не все элементы удовлетворяющие условию на странице?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Значит их нет в теле страницы. CTRL+U нажимайте и смотрите какие данные есть на странице
    Ответ написан
  • Почему парсер ничего не выдаёт?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    А что он должен написать, "Файл создан!"? Файл создается, программа завершила работу
    Ответ написан
  • Парсинг сайта ГИББД.РФ. Проверка получения штрафов?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Лучше поискать какой нибудь API, пусть даже на платной основе, который предоставляет возможность получения штрафов. Вроде яндекс давненько запускала сервис оплаты штрафов, может у них есть что нибудь, либо через госуслуги глянуть, если есть возможость.

    Лично у меня код работает, но на сайте стоит капча, поэтому не думаю что получится много парсить. Как вариант - можно отправлять просто запросы через requests, но предварительно нужно решить капчу через какой нибудь сервис по решению капчи, и вставить ключ решения в captcha

    import requests
    
    regnum = 'В098РЕ'
    regreg = '126'
    stsnum = '56АВ999999'
    captcha = ''
    
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36',}
    
    data = 'regnum={}&regreg={}&stsnum={}&reCaptchaToken={}'.format(regnum, regreg, stsnum, captcha).encode('utf-8')
    
    r = requests.post('https://xn--b1afk4ade.xn--90adear.xn--p1ai/proxy/check/fines', data=data, headers=headers)
    
    print(r.text)
    Ответ написан
    Комментировать
  • Python requests, при выводе всего сайта выводит body и после него: Request unsuccessful. Как пофиксить?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Инкапсула - популярный cdn, с защитой от ботов, ддоса и прочего. Собственно, защищает сайт от подобного.
    Разве что искать обходы / писать свои
    Ответ написан
    Комментировать
  • Как понять,что новость последняя?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Как вы понимаете, что новость новая? Скорее всего помните название последней новости, и если вдруг после перезагрузки страницы название, которое вы запомнили, не совпадает с названием текущей последней новости, значит она новая.
    Ответ написан
  • Почему не парсит?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Зачем псевдокласс? Удаляйте
    Ответ написан
    1 комментарий
  • Python: Как спарсить ссылку, которая находится в стиле?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Много разных подобных обсуждений прочитал, но ответа не нашёл

    Аттрибуты всех тегов можно получить просто по ключу как со словарем.

    from bs4 import BeautifulSoup
    
    html = '''<html lang="en">
    <body>
        <div class="UIMagicalImage_image RestaurantPageMenuItem_pictureImage" role="img" aria-label="Пример" style="background-image: url(&quot;https://primer.ru/test.jpeg&quot;);"></div>
    </body>
    </html>
    '''
    
    soup = BeautifulSoup(html, 'html.parser')
    div = soup.find('div')
    print(div['style'])


    Дальше уже как душе угодно, хоть через find, хоть через regex.

    import re
    url = re.search(r'(https?://.+?)"', div['style']).group(1)
    Ответ написан
  • Как вытащить данные из выплывшего элемента в Python Selenium?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    1. Не нажали на кнопку, данные появляются только после этого
    ogrn_button.click()
    2. На странице несколько элементов с классом _29Sp, так что советую выбрать селектор получше
    Ответ написан
  • Как обходить капчу при парсинге или не допустить ее появления?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    как их например интегрировать в код

    Регистрируетесь в понравившемся сервисе, сервис предоставляет свой API для работы, возможно сразу и готовая библиотека имеется. Читаете документацию, смотрите примеры. В основном работа выглядит так - отправляете запрос на нужный вам сайт, 0.6$ звучит дёшево для гугла, так что предположим что это обычная картинка, так что в данном случае парсите ссылку на картинку капчи. В соответствии с документацией составляете запрос на сервер решения капчи, в тело запроса уже будет входить ссылка на картинку (либо sitekey, в случае гугла, либо любые другие данные для конкретной капчи), указываете тип капчи, использование прокси и тд. Отправляете запрос на сервис, он вернёт какой нибудь номер задачи. Далее уже отправляете запрос на эндпоинт с результатами решения и передаёте на него номер задачи. Там уже сервис вернёт какой-то статус, и если решение готово - пришлёт ответ. Далее этот ответ уже просто нужно будет вложить в нужное место ваших запросов на сайт. В общем, сферический сервис по решению капчи так и работает.
    Лучше зарегистрироваться на сервисе и посмотреть API доку, все станет понятно
    Ответ написан
    3 комментария
  • Ошибка Response [403] при использовании Fake Useragent?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Отличить нормальный переход по URL от запроса через curl/requests/etc довольно таки легко.
    Там стоит Акамай, он известен своим очень агрессивным отношением ко всякого рода автоматизациям и прочим нецелевым использованиям сайтов. Спасибо, если не забанит если быстро F5 нажимать. Так что не думаю что обычной подменой юзерагента здесь можно обойтись, лучше тогда уж selenium в хедлесс режиме, но и его акамай успешно режет, хотя это уже от настроек сайта зависит я думаю.
    Ответ написан
    Комментировать
  • Как получить от item.find то, что записано в class_?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    item_classes = item.get('class', [])
    Ответ написан
    Комментировать
  • Как исправить ошибку none item.find при создании словаря?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    table, а не tabel
    Плюс, вы явно хотите найти только одну таблицу, и в ней уже искать tr.
    А вообще, там таблица чуть поломанная, тег закрывается, не открывшись. Лучше в lxml переключить тогда.

    Ну и по мелочи выбраны не те блоки явно.

    def get_content(html):
        soup = BeautifulSoup(html, 'lxml')
        items = soup.find('table', class_='rating').find_all('tr')
        chars = []
        for item in items:
            chars.append({
                'nick': item.find('a', class_='hint--bottom-right').text,
                'server': item.find('a', class_='realm').text,
                'link': item.find('a', class_='hint--bottom-right').get('href')
    
            })
        print(chars)
    Ответ написан
    Комментировать
  • Парсинг динамического сайта на python?

    SoreMix
    @SoreMix Куратор тега Python
    yellow
    Обычные graphql запросы. viewId всегда одинаковый судя по всему
    endCursor возвращается при каждом запросе

    import requests
    
    data = [{"operationName":"EventExhibitorList","variables":{"viewId":"RXZlbnRWaWV3XzE1MjUyMA==","search":"","selectedFilters":[{"mustEventFiltersIn":[]}]},"extensions":{"persistedQuery":{"version":1,"sha256Hash":"ee232939a5b943c0d87a4877655179bc2e5c73472ff99814119deddb34e0a3b6"}}}]
    
    response = requests.post('https://api.swapcard.com/graphql', json=data).json()
    # парсим нужные данные тут
    
    end_cursor = response[0]['data']['view']['exhibitors']['pageInfo'].get('endCursor')
    
    while end_cursor:
        data = [{"operationName":"EventExhibitorList","variables":{"viewId":"RXZlbnRWaWV3XzE1MjUyMA==","search":"","selectedFilters":[{"mustEventFiltersIn":[]}],"endCursor":end_cursor},"extensions":{"persistedQuery":{"version":1,"sha256Hash":"ee232939a5b943c0d87a4877655179bc2e5c73472ff99814119deddb34e0a3b6"}}}]
        
        response = requests.post('https://api.swapcard.com/graphql', json=data).json()
    
        # тут парсим нужные данные
    
        end_cursor = response[0]['data']['view']['exhibitors']['pageInfo'].get('endCursor')
    Ответ написан
    1 комментарий