Web Scrapping. Basics.

Поговорим о приятном и полезном. Мы хотим совершенствоваться в программировании и изучать полезные с практической и материальной точки зрения приемы.

Внимание.

Публикация является исключительно ознакомительной и ни в коем случае не призывает ни к каким действиям. Автор не несет ответственности за последствия использования данной информации.

Поговорим о приятном и полезном. Мы хотим совершенствоваться в программировании и изучать полезные с практической и материальной точки зрения приемы.

Я говорю о работе с web. И в этом деле есть немало направлений. Может быть вы пишите какие-то автотесты для веб приложения или вам нужно нажать две кнопки на ста страницах, может вы хотите собрать данные или что еще угодно.

  • мы сможем заработать, помогая в этом плане другим
  • мы выполняем свои внутренние задачи
  • другие цели (корыстные и без(с))

Имитировать человеческую активность в браузере можно двумя путями:

  • selenium (управляем самим браузером)
  • http libs (дергаем запросы сразу на backend)

Начнем со второго, как с базы.

Requests

Нам понадобится как обычно python requests library and chrome dev tools

(или в принципе режим разработчика в любом браузере)

И чтобы было более интересно, берем реальную задачу: я хочу проверять свой баланс в лк провайдера.

Step_1. Открываем форму авторизации в лк, открываем режим разработчика, вводим данные (не обязательно корректные) и жмем кнопку Login

В списке вызванных методов видим самый первый, сработавший после нажатия на кнопку (как правило содержит в названии слово ‘login’, а Request Method чаще всего POST)

Step_2. Выбрав этот метод, де-то в соседнем окошке получаем информацию об этом вызове: все переданные и принятые заголовки и данные

Request URL: адрес, на который мы будем отправлять авторизационные данные

Form Data: авторизационные данные, внезапно 🙂

Нажав view source у Form Data мы увидим что-то подобное:

Это понадобится нам для выбора заголовка Content Type. В данном случае это application/x-www-form-urlencoded.

Если бы в source был чистый json, заголовок запроса был бы скорее всего

application/json

(А можно просто посмотреть его в разделе Request Headers)

И также мы видим что в ответ на POST нам возвращается сразу страница, а это значит, что нам не нужно хранить сессию, куки, а мы можем сразу работать

Step_3. Code

Вот таким образом, не мудрствуя лукаво, в переменной page_data у нас сохранится исходный код страницы. Давайте выдернем оттуда необходимые данные.

Step_4. Scraping

Находим на странице то место, где выводится инфо о балансе, ПКМ -> Просмотреть код (элемента, не страницы) и что мы видим

Вот он, элемент, в котором хранится баланс.

Добавляем щепотку кода

— загрузили полученный текст в soup

— и попросили найти все h2 элементы, дополнительно указав для поиска класс интересного нам заголовка

Вывод:

[<h2 class="m-0 counter text-dark font-600">300,00 Р</h2>]

Всего один элемент найден, нам повезло, это как раз то, что нам нужно.

Чтобы получить непосредственно value элемента, используем

sell_raw[0].contents[0]

Которое вернет нам чистое значение поля 300,00 Р, с которым можно делать все что заблагорассудится.

Фишечка: у многих провайдеров по умолчанию логин-пасс = номер договора. А это значит, что зная ваш собственный номер, вы можете легко взять range +- 10000 номеров и прогнать простеньким скриптом все аккаунты.

Только не забудьте юзануть прокси хотяб.

Selenium

Нередки случаи, когда одними запросами не зарешаешь. Вот один из примеров.

На Upwork поймал заказик, человек просил накрутить голоса на странице (голосовалки там уже нет)

(естесн не реклама, нахрен они бы мне сдались, заказчик, кстати, потерялся)

Алгоритм до безумия простой: -> жмешь кнопку Vote -> js привозит тебе окошко -> в него вводишь Fullname, email -> жмешь Submit -> голос зачтен

Все методы и url я отловил, да вот незадача. Отправляемые POST data выглядели вот так

Все было ясно как день, но параметр vn брался изниоткуда и ни от чего не зависел. Не мог я его никак ни получить ни посчитать.

Поэтому, я решил не морочиться и имитировать нажатие кнопок.

from selenium import webdriver

try:
    browser = webdriver.Chrome()
    browser.delete_all_cookies()
    browser.get(ENDPOINT)
    time.sleep(1)

    ref_list = browser.find_element_by_class_name('vote-button').click()
    time.sleep(1)

    fullname = browser.find_element_by_id("voter-name")
    e_mail = browser.find_element_by_id("voter-email")

    fullname.send_keys(name)
    e_mail.send_keys(email)

    browser.find_element_by_id("submit-vote").click()
    time.sleep(10)
    browser.quit()
except KeyboardInterrupt:
    browser.quit()

Ну здесь и описнять особо нечего. Пример очень хорошо показывает базовое использование.

— создается объект браузерного окна Chrome

— чистим куки на всякий

— get URL

— жмем на кнопку Голосовать

— ждем на всякий чтобы все подгрузилось

— находим элементы формы по ID и заполняем их данными

— жмем кнопку Submit

— убедившись что все прошло (там сабмит уходил в 3 запроса внутренних), закрываем браузер.

Че по итогам

  • если на вашем пути встретится капча, это все может уже либо не сработать, либо придется сильно попотеть, используя сторонние сервисы или решатели капчи или что-то там еще
  • если на ваш POST возвращается не сразу страница, а ответ типа {‘login’: ‘ok’}, и дальше грузится уже портал, значит нужно сделать сразу после POST авторизации, GET запрос на целевую страницу. И лучше всего делать это в рамках одной сессии.
http_client = requests.Session()
p = http_client.post(login_url, data=payload, headers=headers)
if p.status_code == 200:
  g = http.client.get(endpoint_url)
  print(g.text)

AskDevops —> https://t.me/ithangouts

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *