Парсинг: смена заголовков и прокси

Пишу парсер и у меня есть три списка: 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

→ Ссылка