Пишем парсер свежих прокси на Python для Selenium - LEFT JOIN

Свяжитесь с нами в любой удобной для вас форме

Менеджер

Написать в телеграмм

Онлайн
Телеграмм
или
Заполните форму

2 минут чтения

*

3 июля 2020 г.

Пишем парсер свежих прокси на Python для Selenium

Случается такое, что во время парсинга страниц через Selenium можно словить бан по IP-адресу. Чтобы этого избежать, лучше использовать прокси. Сегодня напишем скрипт, который сам спарсит новые прокси, проверит их и в случае успеха передаст в Selenium.

Парсинг новых прокси

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


import requests_html
from bs4 import BeautifulSoup
import pickle
import requests

Все прокси будем хранить в множестве px_list, а также отправлять в pickle-файл proxis.pickle. В случае, если он не будет пустым, попробуем взять из него данные.


px_list = set()
try:
    with open(‘proxis.pickle’, ‘rb’) as f:
            px_list = pickle.load(f)
except:
    pass

Функция scrap_proxy() будет заходить на сайт free-proxy-list.net и собирать оттуда 20 последних прокси. На сайте новые адреса появляются ежеминутно. Вот, как выглядит интересующая нас область сайта:

Из всего этого будем собирать ID Address и Port. Посмотрим, как элементы расположены в коде страницы:

Все нужные данные являются ячейками таблицы. В цикле будем брать первые 20 строк, обращаясь к IP-адресу и порту по xpath. В конце функция будет отправлять свежие прокси в pickle-файл и возвращать список прокси.


def scrap_proxy():  
    global px_list
    px_list = set()

    session = requests_html.HTMLSession()
    r = session.get(‘https://free-proxy-list.net/’)
    r.html.render()
    for i in range(1, 21):
        add=r.html.xpath(‘/html/body/section[1]/div/div[2]/div/div[2]/div/table/tbody/tr[{}]/td[1]/text()’.format(i))[0]
        port=r.html.xpath(‘/html/body/section[1]/div/div[2]/div/div[2]/div/table/tbody/tr[{}]/td[2]/text()’.format(i))[0]
        px_list.add(‘:’.join([add, port]))

    print(«—New proxy scraped, left: » + str(len(px_list)))
    with open(‘proxis.pickle’, ‘wb’) as f:
        pickle.dump(px_list, f)
    return px_list

Проверка полученных прокси

Не всегда свежие прокси оказываются рабочими: мы напишем функцию, которая сама отправит get-запрос к сайту Google с прокси и в случае появления любой ошибки будет возвращать False. В случае, если прокси оказался рабочим, функция вернёт True.


def check_proxy(px):
    try:
        requests.get(«https://www.google.com/», proxies = {«https»: «https://» + px}, timeout = 3)
    except Exception as x:
        print(‘—‘+px + ‘ is dead: ‘+ x.__class__.__name__)
        return False
    return True

Основная функция

Главная функция скрипта будет принимать в аргумент переменную scrap, по умолчанию принимающую False. Мы будем собирать новые прокси только в том случае, если scrap == True или длина списка прокси менее 6. Затем в цикле while True собираем новые прокси, берём последний, проверяем его и в случае, если check_proxy вернёт True, отправляем прочие прокси в pickle-файл и возвращаем рабочий адрес и порт.


def get_proxy(scrap = False):
    global px_list
    if scrap or len(px_list) < 6:
            px_list = scrap_proxy()
    while True:
        if len(px_list) < 6:
            px_list = scrap_proxy()
        px = px_list.pop()
        if check_proxy(px):
            break
    print('-'+px+' is alive. ({} left)'.format(str(len(px_list))))
    with open('proxis.pickle', 'wb') as f:
            pickle.dump(px_list, f)
    return px
[/code_snippet]



<h2 class="wp-block-heading">Используем скрипт с Selenium</h2>



<p>А ещё мы писали, как через Selenium <a href="http://leftjoin.ru/all/selenium-button/" data-type="link" data-id="http://leftjoin.ru/all/selenium-button/"><strong>имитировать нажатие кнопки</strong></a> и <a href="http://leftjoin.ru/all/parsim-dannye-kataloga-sayta-ispolzuya-beautiful-soup-i-selenium/" data-type="link" data-id="http://leftjoin.ru/all/parsim-dannye-kataloga-sayta-ispolzuya-beautiful-soup-i-selenium/"><strong>скроллинг каталога интернет-магазина</strong></a></p>



<p>Чтобы к скрипту Selenium подключить прокси, импортируем функцию <span class="inline-code">get_proxy</span>. Заходим в бесконечный цикл, в переменную <span class="inline-code">PROXY</span> запишем свежие полученные прокси и, используя опции браузера, добавим наши прокси и инициируем новый webdriver с обновленными опциями. Затем пробуем зайти на сайт, добавить свои cookie и в случае успеха выходим из цикла оператором <span class="inline-code">break</span>. Если новый прокси всё равно оказался нерабочим или вылезла капча, в цикле получим новые прокси и повторим, пока не получится.</p>



[code_snippet]
from px_scrap import get_proxy

while True:
    PROXY = get_proxy(scrap=True)
    options.add_argument(‘—proxy-server=%s’ % PROXY)
    driver = webdriver.Chrome(chrome_options=options, executable_path=os.path.abspath(«chromedriver»))
    try:
        driver.get(‘https://google.com’)
        driver.add_cookie(cookies)
    except:
        print(‘Captcha!’)
1572 просмотров

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

[ Рекомендации ]

Читайте также

1 минута чтения

*

21 ноября 2021

How to: Google App Script

[ Дальше ]