Ответы пользователя по тегу Парсинг
  • Как парсить защищенные сайты?

    hottabxp
    @hottabxp
    Сначала мы жили бедно, а потом нас обокрали..
    Как парсить защищенные сайты в 2020 году?
    Точно так же, как и в 2019.
    Есть надежный(более или менее) способ. Скачиваете скелет расширения для вашего браузера, и пишите расширение на js для парсинга. Я не зная js, но зная python написал за пару вечеров расширение для парсинга номеров с olx. Оно было простенькое, номера выводились в консоль разработчика - тем не менее работало. Зная суть программирования, можно написать софт, который решает вашу задачу практически на любом языке за пару вечеров.
    Ответ написан
  • Как бороться с lazy loading при парсинге сайта?

    hottabxp
    @hottabxp
    Сначала мы жили бедно, а потом нас обокрали..
    F12. Далее делаем прокрутку, и видим что запросы отправляются по адресу rn-sport.com.ua/category/tyazhelaya-atletika/?_=1602592184845&page=3

    Параметр page отвечает за номер страницы. Всего 25 страниц:
    5f859e6152411051962365.png
    Ответ написан
  • Что не так с моим парсером на python?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Я уже здесь неоднократно советовал, возьмите себе за правило, перед любым парсингом, загрузите страницу с помощью скрипта себе на диск. Далее откройте страницу в текстовом редакторе, и поищите - есть ли нужный элемент с нужным классом(или id) в html. Если есть, значит можно работать requests'том. В противном случае - Selenium (есть еще XHR...).
    Вот сам код:
    import requests
    
    headers = {'user-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0',
    			'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
    }
    
    url = 'ссылка'
    filename = 'index.html'
    
    response = requests.get(url,headers=headers)
    if response.status_code == 200:
        with open(filename,'w') as file:
            file.write(response.text)
    else:
    	print(response)

    Вписываете ссылку и запускаете скрипт. Если все ОК - на диске появится файл index.html(на этом файле можно дальше тренироваться с парсингом). В противном случае - в консоль вылетит HTTP код ошибки. Если ошибка, подставляете заголовки, cookies ... и заново.

    Конкретно в данном случае, элемента div с классом play-detail в html нет. Он появиться после обработки js скриптов js движком. Но выход есть. Все данные есть. Но они в формате json в теге script с id (если не ошибаюсь) - json-extras.
    Ответ написан
    1 комментарий
  • Как парсить постоянно подгружаемую страницу на питоне?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    F12, далее смотрите XHR запросы.
    Ответ написан
  • Нужно спарсить таблицу с сайта?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    import requests
    from bs4 import BeautifulSoup
    from lxml import html
    import csv
    
    headers = {'user-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0',
    			'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
    }
    
    url = 'https://opi.dfo.kz/p/ru/DfoObjects/objects/teaser-view/25720?RevisionId=0&ReportNodeId=2147483637&PluginId=6c2aa36248f44fd7ae888cb43817d49f&ReportId=61005620'
    
    response = requests.get(url,headers=headers)
    
    file = open('data.csv','w') # Открываем файл на запись. Можно было использовать контекстный менеджер, но так думаю проще.
    writer = csv.writer(file) # Передаем в функцию writer дескриптор открытого файла.
    
    soup = BeautifulSoup(response.text,"html.parser")
    
    rows = soup.find('table',class_='dsnode-table').find('tbody').find_all('tr') # Ищем в html тег 'table' с классом 'dsnode-table',
    # далее в найденом ищем тег 'tbody' и наконец ищем все теги 'tr'. Тег 'tr' в html это тег строки таблицы. В результате, в rows 
    # у нас окажутся все теги 'tr', тоесть все строки таблицы.
    
    for row in rows: # Проходимся по всем строкам. При каждой итерации, в row у нас будет следующая строка таблицы, вместе с html тегами.
    	columns = row.find_all('td') # Ищем в текущей строке таблици все теги 'td'. В html td - это тег ячейки.
    	data_list = [columns[0].text,columns[1].text,columns[2].text,columns[3].text,columns[4].text,columns[5].text,columns[6].text,columns[7].text,columns[8].text]
    	# Так как в каждой строке 9 ячеек, а элементы списка в большинстве ЯП нумеруюются с нуля, то мы можем обратится к конкретной ячейке
    	# текущей строки по индексу. Первая ячейка будет columns[0], а последняя, тоесть девятая - columns[8]. Создаем список 'data_list',
    	# и заносим в него все ячейки текущей строки. Но, так как в columns кроме текстовых данных также присутствуют html теги, мы обращаемся 
    	# к свойству .text, что-бы получить сам текст, без тегов.
    	writer.writerow(data_list) # Записываем текущую строку в csv файл. 
    	# Далее цикл продолжается, пока не достигнет конца таблицы(условно, так как все строки таблици мы уже получили, и они хранятся в 'rows')
    
    file.close() # Так как мы не используем контекстный менеджер with, обязательно закрываем открытый файл.

    Результат:
    5f31c1f7ca811013254566.png
    Ответ написан
    Комментировать
  • Как спарсить цену скина в Steam?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Обязательно нужно в заголовках передавать Accept и Accept-Language(конкретно в данном случае), так как без этих заголовков блок с товарами не возвращается:
    spoiler
    5f1db55c8aa7d080819128.png

    Вот рабочий код, правда без колорамы, думаю разберетесь:
    from bs4 import BeautifulSoup
    import requests
    
    gun_name1 = 'M4A4'
    skin_name1 = 'Безлюдный космос'
    wear_name1 = 'После полевых испытаний'
    headers = {
    
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Accept-Language': 'ru-UA,ru;q=0.9,en-US;q=0.8,en;q=0.7,ru-RU;q=0.6',
    }
    steam_link = ('https://steamcommunity.com/market/search?appid=730&q=' + gun_name1 +'|' + skin_name1 + '%28' + wear_name1 + '%29')
    full_page = requests.get(steam_link, headers=headers)
    soup = BeautifulSoup(full_page.content, 'html.parser')
    
    skins = soup.find_all('a',class_='market_listing_row_link')
    
    for skin in skins:
    	name = skin.find('span',class_='market_listing_item_name').text
    	counts = skin.find('span',class_='market_listing_num_listings_qty').text
    	price = skin.find('span',class_='sale_price').text.replace('От','').strip() #HACK
    
    
    	print(f'{name}: {counts} - {price}')

    Результат

    M4A4 | Безлюдный космос (После полевых испытаний): 461 - $11.48 USD
    StatTrak™ M4A4 | Безлюдный космос (После полевых испытаний): 44 - $32.53 USD
    M4A4 | Азимов (После полевых испытаний): 52 - $117.83 USD
    M4A4 | Зірка (После полевых испытаний): 172 - $11.86 USD
    M4A4 | Рентген (После полевых испытаний): 82 - $10.78 USD
    M4A4 | Грифон (После полевых испытаний): 264 - $5.10 USD
    M4A4 | Магний (После полевых испытаний): 6,243 - $0.28 USD
    M4A4 | Преобразователь (После полевых испытаний): 434 - $2.01 USD
    M4A4 | Смерч (После полевых испытаний): 154 - $1.90 USD
    M4A4 | Неонуар (После полевых испытаний): 206 - $18.22 USD


    Только обратите внимание, там к скинам несколько цен - цена продажи, обычная цена и т.д. Я в стиме не понимаю.
    И на будущее, всегда проверяйте ответ, который вы получаете в результате запроса. Только не статус-код(200,404 и т.д.), а сохраняйте ответ в файл и смотрите содержимое в блокноте или в браузере. Пример:
    with open('index.html','w') as file:
    	file.write(full_page.text)

    Данный код запишет в файл index.html ответ на ваш запрос.
    Ответ написан
    1 комментарий
  • Стоит ли парсить на сайт инфо с других сайтов?

    hottabxp
    @hottabxp
    Сначала мы жили бедно, а потом нас обокрали..
    Чем грозит всё это для сайта юрбюро?
    Ни чем. Берите инфу из сайта "ВЕРХОВНЫЙ СУД РОССИЙСКОЙ ФЕДЕРАЦИИ" со ссылкой на первоисточник. У них черным по белому написано:
    Об использовании информации сайта

    Материалы сайта Верховного Суда Российской Федерации могут быть воспроизведены в средствах массовой информации, на серверах сети Интернет или иных носителях со ссылкой на первоисточник.

    Копии решений Верховного Суда Российской Федерации, воспроизведенные с сайта, приобретают юридическую значимость при наличии реквизитов, проставленных в соответствии с порядком, установленным Инструкцией по делопроизводству в Верховном Суде Российской Федерации.
    Ответ написан
    Комментировать
  • Ошибка в коде парсера питон, в чем ошибка?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Скорее всего сначала идут топовые объявления, и у них может быть другой класс (не разбирался).
    Можно просто добавить try...except:
    for item in items:
        try:
            comps.append({
              'title': item.find('a', class_ = 'marginright5 link linkWithHash detailsLink').get_text(strip = True),
              'price': item.find('p', class_ = 'price').get_text(strip = True),
              'link': item.find('a', class_ = 'marginright5 link linkWithHash detailsLink').get('href')
            })
        except:
            pass
    
      for comp in comps:
        print(f'{comp["title"]} -> Price: {comp["price"]} -> Link: {comp["link"]}')
    
    parse()
    Ответ написан
    4 комментария
  • Как парсить с сайта на Джанге?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    div = soup.find('div', class_='class').text
    print(div)
    Ответ написан
    1 комментарий
  • Выдает ошибку при парсинге страницы, как исправить?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Нужно либо делать проверку, либо оборачивать код в try...except:
    for item in items:
    	try:
    		d.append({
    		'title': item.find('div', class_='item-name').text,
    		'address': item.find('span', class_='item-address').text,
    		'p': item.find('div', class_='item-description').text.replace('\xa0','')
    		})
    	except:
    		pass

    На странице присутствует пустой тег li с классом item. Скорее всего в данный пустой тег встраивается рекламный блок, но так как adblock блокирует рекламу, то блок получается пустой, вот и получается исключение.
    5ede2176ede6a830455430.png
    Ответ написан
    1 комментарий
  • Сохранить как html, через python, как?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Смотрите в браузере xhr запросы. Данные поиска подгружаются динамически.
    Вот пример:
    import json
    import requests
    from bs4 import BeautifulSoup
    
    headers = {'user-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0',
    			'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
    }
    
    response = requests.get('https://brain.com.ua/search/1187/?Search=10750&Offset=0',headers=headers)
    
    j_data = json.loads(response.text)
    
    soup = BeautifulSoup(j_data['ProductsGrid'],'lxml')
    
    items = soup.find_all('div',class_='col-lg-3 col-md-4 col-sm-6 col-xs-6 product-wrapper br-pcg-product-wrapper')
    
    for item in items:
    	url = 'https://brain.com.ua'+ item.find('h3').a.get('href')
    	title = item.get('data-name')
    	print(f'{title} - {url}')

    spoiler
    Источник бесперебойного питания Back-UPS CS 500 APC (BK500EI) - https://brain.com.ua/Istochnik_bespereboynogo_pita...
    Конструктор LEGO Juniors Грузовик дорожной службы (10750) - https://brain.com.ua/Konstruktor_LEGO_Juniors_Gruz...

    5ed7f923360ec390591389.png
    Ответ написан
  • При прасинге страницы некорректно отображается кирилица. Как исправить?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Вот так можно получить "читаемый" html:
    url = 'https://cars.av.by/subaru'
    response = requests.get(url,headers=headers)
    response.encoding = response.apparent_encoding
    print(response.text)

    Только вам в парсере нужно подкорректировать строки вида:
    replace("1 из ",""))
    заменить строки вида '1 из' на русские.
    Ответ написан
    3 комментария
  • Process finished with exit code 2?

    hottabxp
    @hottabxp
    Сначала мы жили бедно, а потом нас обокрали..
    Нужно переместить файл .py в директорию, в пути которой нет кириллических символов. То же самое можно сделать и с интерпретатором.
    Кинопоиск отдает requests'у капчу. Можно убедится, выполнив данный код:
    import requests
    
    r=requests.get('https://www.kinopoisk.ru/top/navigator/m_act%5Bcountry%5D/1%2C1/m_act%5Bhide%5D/on/m_act%5Byears%5D/2019%3A/m_act%5Bnum_vote%5D/12500/m_act%5Bex_rating%5D/6%3A/m_act%5Bis_film%5D/on/order/ex_rating/#results')
    print(r.text)
    Ответ написан
    Комментировать
  • Как спарсить атрибут target=_"_blank"> спомошью BeautifulSoup в Python?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Это:
    #'name': item.select('a', 'target="_blank">').get_text ТУТ ДОЛЖЕН БЫЛ БЫТЬ ПАРСИНГ ИМЕНИ И ФАМИЛИИ

    заменить на это:
    'name': item.text
    Output
    [{'title': 'https://vk.com/stusha45', 'name': 'Стюша Сергеева'}, {'title': 'https://vk.com/id209266081', 'name': 'Юлия Сухова'}, {'title': 'https://vk.com/id394370251', 'name': 'Нина Ляшенко'}, {'title': 'https://vk.com/id473065083', 'name': 'Андрей Кротов'}, {'title': 'https://vk.com/id491175633', 'name': 'Тамара Петрова'}]
    Ответ написан
  • Как обойти защиту от парсинга с помощью Python?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    1) Делайте задержку перед каждым запросом.
    2) Накидайте расширений(тот же adblock) в профиль selenium. Походите по нескольким страницам в selenium вручную.
    Ответ написан
    1 комментарий
  • Получить HTML код из Inspect Element, а не из Page Source (Python)?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Вопрос задан не совсем корректно. Покажите, что есть в инспекте, а чего нет в source
    Selenium. Скорее всего, контент на странице генерирует js.
    Ответ написан
  • Как можно быстро получать информацию по коэффициентам в букмекерской конторе?

    hottabxp
    @hottabxp
    Сначала мы жили бедно, а потом нас обокрали..
    но говорят можно как то по другому ещё быстрее перехватывать информацию
    - Ну так и спросите у тех кто говорит.
    Некоторые сайты используют websoket. Если та конторка тоже его использует, то подключайтесь к websocket и получайте данные. Только учтите:
    ws: - незашифрованный websocket(типа http)
    wss: - зашифрованный websocket(типа https)
    Ответ написан
    Комментировать
  • Python достать текст внутри тега?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    my_div = soup.find('div',class_='rating-box__active').get('style')
    	print(my_div)	# Вывод - width: 100%
    	print(my_div[7:-1])	# Вывод - 100

    Код нужно вставлять в теги, без них хабр скушал ваш пример.
    Ответ написан
    6 комментариев
  • Где можно покупать, продавать ботов?

    hottabxp
    @hottabxp
    Сначала мы жили бедно, а потом нас обокрали..
    Ответ написан
    Комментировать
  • Python. Selenium. Парсится лишняя информация, как скорректировать путь?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Обращайтесь к первому элементу div:
    prices= driver.find_elements_by_css_selector("div.product_item__description > div")
    print(prices[0].text)

    Только что попробовал, работает.
    Ответ написан