Парсинг: смена заголовков и прокси
Пишу парсер и у меня есть три списка: sites, headers и proxies, а также функция, которая принимает по одному аргументу. Я хочу что бы после обработки каждых двух url, менялись header и proxy попарно следующие, но как это реализовать?
import requests
proxies = ['some-proxy-1', 'some-proxy-2', 'some-proxy-3']
headers = [
{'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'},
{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2'},
{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/58.0.1'}
]
sites = ['site-1.ru', 'site-2.ru', 'site-3.ru', 'site-4.ru', 'site-5.ru', 'site-6.ru', 'site-7.ru']
def get_data(url, header, proxy):
r = requests.get(url, headers=header, proxies=proxy)
with open('index.html', 'w') as f:
f.write(r.text)
if __name__ == '__main__':
pass
Ответы (2 шт):
Автор решения: GrAnd
→ Ссылка
Как вариант, использовать генераторы, которые будут перебирать ваши headers и proxies по 2 штуки.
proxies = ['some-proxy-1', 'some-proxy-2', 'some-proxy-3']
headers = [
{'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'},
{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2'},
{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/58.0.1'}
]
sites = ['site-1.ru', 'site-2.ru', 'site-3.ru', 'site-4.ru', 'site-5.ru', 'site-6.ru', 'site-7.ru']
def get_element_n_times(lst, n):
while True:
for elem in lst:
for _ in range(n):
yield elem
def get_header_and_proxy():
gen_header = get_element_n_times(headers, 2)
gen_proxy = get_element_n_times(proxies, 2)
while True:
yield (next(gen_header), next(gen_proxy))
def get_data(url, header, proxy):
print(url, header, proxy)
if __name__ == '__main__':
gen = get_header_and_proxy()
for url in sites:
get_data(url, *next(gen))
На выходе будет:
site-1.ru {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'} some-proxy-1
site-2.ru {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'} some-proxy-1
site-3.ru {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2'} some-proxy-2
site-4.ru {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2'} some-proxy-2
site-5.ru {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/58.0.1'} some-proxy-3
site-6.ru {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/58.0.1'} some-proxy-3
site-7.ru {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'} some-proxy-1
Если нужно брать более рандомно, то вот такой генератор:
def get_random_element_n_times(lst, n):
elem = None
while True:
elem_new = random.choice(lst)
if elem_new != elem:
elem = elem_new
for _ in range(n):
yield elem
Автор решения: Jack_oS
→ Ссылка
import random
proxies = ['some-proxy-1', 'some-proxy-2', 'some-proxy-3']
headers = [
{'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'},
{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2'},
{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/58.0.1'}
]
sites = ['site-1.ru', 'site-2.ru', 'site-3.ru', 'site-4.ru', 'site-5.ru', 'site-6.ru', 'site-7.ru']
h = random.choice(headers)
p = random.choice(proxies)
for i, url in enumerate(sites):
print(f'{i} {url} {h} {p}')
if i%2:
h_new = random.choice(headers)
p_new = random.choice(proxies)
while h == h_new or p == p_new:
h_new = random.choice(headers)
p_new = random.choice(proxies)
h, p = h_new, p_new
после пары сайтом сменит заголовок и прокси на новый случайный, не равный предыдущему:
0 site-1.ru {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'} some-proxy-1
1 site-2.ru {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'} some-proxy-1
2 site-3.ru {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/58.0.1'} some-proxy-3
3 site-4.ru {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/58.0.1'} some-proxy-3
4 site-5.ru {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'} some-proxy-2
5 site-6.ru {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'} some-proxy-2
6 site-7.ru {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2'} some-proxy-3