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!’)
[ Рекомендации ]
Читайте также
[ Связаться ]
Давайте раскроем потенциал вашего бизнеса вместе
Заполните форму на бесплатную консультацию