Я написал скрипт на python, использующий прокси при отправке запросов на некоторые ссылки, чтобы проанализировать название продукта оттуда. Моя текущая попытка делает работу без нареканий. Эта функция parse_product()
полностью зависит от возвращаемого результата (прокси), чтобы правильно использовать тот же прокси. Я пытаюсь изменить функцию parse_product()
таким образом, чтобы сама функция не зависела от предыдущего вызова той же функции, чтобы повторно использовать работающий прокси до тех пор, пока он не станет недействительным. Чтобы быть понятнее - я ожидаю, что основная функция будет больше, как показано ниже. Тем не менее, когда все будет решено, я буду использовать многопроцессорность, чтобы скрипт работал быстрее:
if __name__ == '__main__':
for url in linklist:
parse_product(url)
и все же ожидаю, что скрипт будет работать так, как сейчас.
Iпробовал с (работающим):
import random
import requests
from random import choice
from urllib.parse import urljoin
from bs4 import BeautifulSoup
linklist = [
'https://www.amazon.com/dp/B00OI0RGGO',
'https://www.amazon.com/dp/B00TPKOPWA',
'https://www.amazon.com/dp/B00TH42HWE'
]
proxyVault = ['103.110.37.244:36022', '180.254.218.229:8080', '110.74.197.207:50632', '1.20.101.95:49001', '200.10.193.90:8080', '173.164.26.117:3128', '103.228.118.66:43002', '178.128.231.201:3128', '1.2.169.54:55312', '181.52.85.249:31487', '97.64.135.4:8080', '190.96.214.123:53251', '52.144.107.142:31923', '45.5.224.145:52035', '89.218.22.178:8080', '192.241.143.186:80', '113.53.29.218:38310', '36.78.131.182:39243']
def process_proxy(proxy):
global proxyVault
if not proxy:
proxy_url = choice(proxyVault)
proxy = {'https': f'http://{proxy_url}'}
else:
proxy_pattern = proxy.get("https").split("//")[-1]
if proxy_pattern in proxyVault:
proxyVault.remove(proxy_pattern)
random.shuffle(proxyVault)
proxy_url = choice(proxyVault)
proxy = {'https': f'http://{proxy_url}'}
return proxy
def parse_product(link,proxy):
try:
if not proxy:raise
print("checking the proxy:",proxy)
res = requests.get(link,proxies=proxy,timeout=5)
soup = BeautifulSoup(res.text,"html5lib")
try:
product_name = soup.select_one("#productTitle").get_text(strip=True)
except Exception: product_name = ""
return proxy, product_name
except Exception:
"""the following line when hit produces new proxy and remove the bad one that passes through process_proxy(proxy)"""
proxy_link = process_proxy(proxy)
return parse_product(link,proxy_link)
if __name__ == '__main__':
proxy = None
for url in linklist:
result = parse_product(url,proxy)
proxy = result[0]
print(result)
Примечание: parse_product()
функция возвращает прокси и название продукта. Однако прокси, который возвращает функция, повторно используется в той же функции parse_product()
до тех пор, пока не станет недействительным.
Кстати, прокси, используемые в proxyVault, являются просто заполнителями.