Proxy в selenium, запуск локального smtp и несколько вопросов про pandas
Теги:
Использование proxy вместе с [selenium]
Можно спарсить бесплатные прокси, но надо учитывать, что их доступность может быть крайне низкой. Пример
>>> from selenium import webdriver
>>> from selenium.webdriver.chrome.options import DesiredCapabilities
>>> import random
>>> class WebDriver:
... """Selenium webdriver context manager"""
... def __init__(self, driver: webdriver.Firefox):
... self.driver = driver
... def __enter__(self):
... return self.driver
... def __exit__(self, exc_type, exc_val, exc_tb):
... self.driver.quit()
>>> service = webdriver.firefox.service.Service('./geckodriver', port=8080)
>>> with WebDriver(webdriver.Firefox(service=service)) as driver:
... driver.get("https://free-proxy-list.net/")
... html = driver.page_source
... soup = bs(html, 'html.parser')
... proxies = soup.find('textarea', class_='form-control').string
>>> prox = [pr for pr in proxies.split('\n') if pr and pr[0].isnumeric()]
>>> random.shuffle(prox)
>>> print(prox)
['94.247.244.120:3128',
'151.232.72.21:80',
'103.228.118.78:8080',
'103.87.164.76:8080',
...
Еще статья. Обсуждение на оверфло
Использование smtplib на localhost
Необходимо вначале запустить сервер с выводом отладочной информации. Вот так:
python -m smtpd -n -c DebuggingServer localhost:1025
Смотри еще [email-tools-python]
Несколько вопросов про [pandas]
Ошибка “ValueError: If using all scalar values, you must pass an index”
В сообщении об ошибке говорится, что если вы передаете скалярные значения, вы должны передать индекс. Решение - не использовать скаляры или передать индекс:
>>> a = 2
>>> b = 3
>>> df = pd.DataFrame({'A': [a,], 'B': [b,]})
>>> df
A B
0 2 3
>>> df = pd.DataFrame({'A': a, 'B': b}, index=[0])
>>> df
A B
0 2 3
Convert a Pandas DataFrame into a single row DataFrame
df = df[0].stack().swaplevel().to_frame().T
df.columns = df.columns.map('{0[0]}_{0[1]}'.format)
Converting string that looks like a list into a real list - python
Иногда бывает полезно упаковать список в ячейку [pandas] в виде строки (т.к. архитектура модуля крайне не способствует хранению списков)
>>> import ast
>>> ast.literal_eval("[(0, 1), (1, 3), (2, 1), (3, 1), (4, 1)]")
[(0, 1), (1, 3), (2, 1), (3, 1), (4, 1)]
>>> ast.literal_eval("[(0, 1, 6), (1, 3,7), (3, 1,4), (3, 1,3), (8, 1,2)]")
[(0, 1, 6), (1, 3, 7), (3, 1, 4), (3, 1, 3), (8, 1, 2)]
>>> ast.literal_eval("[1,2,3,5,3]")
[1, 2, 3, 5, 3]