Вы можете использовать стандартный пакет concurrent.futures в python для многопроцессорной обработки и многопоточности.
В вашем случае многопоточность не нужна, многопоточность поможет. Потому что ваша функция в вычислительном отношении дорогая.
К, используя многопоточность, вы можете отправлять несколько запросов одновременно. Аргумент number_of_threads
может контролировать номер запроса, который вы хотите отправить за раз.
Я создал функцию, extract_data_from_url_func
, которая будет извлекать данные из одного URL, и я передаю эту функцию и список URL-адресов многопоточному исполнителю с использованием concurrent.futures.
from bs4 import BeautifulSoup as soup
from concurrent.futures import ThreadPoolExecutor
import requests
page_url = "url.xml"
number_of_threads = 6
out_filename = "prices.csv"
headers = "availableOffers,otherpricess,currentprice \n"
def extract_data_from_url_func(url):
print(url)
response = requests.get(url)
page_soup = soup(response.text, "html.parser")
availableOffers = page_soup.find("input", {"id": "availableOffers"})["value"]
otherpricess = page_soup.find("span", {"class": "price"}).text.replace("$", "")
currentprice = page_soup.find("div", {"class": "is"}).text.strip().replace("$", "")
output_list = [availableOffers, otherpricess, currentprice]
output = ",".join(output_list)
print(output)
return output
with open("url.xml", "r") as fr:
URLS = list(map(lambda x: x.strip(), fr.readlines()))
with ThreadPoolExecutor(max_workers=number_of_threads) as executor:
results = executor.map( extract_data_from_url_func, URLS)
responses = []
for result in results:
responses.append(result)
with open(out_filename, "w") as fw:
fw.write(headers)
for response in responses:
fw.write(response)
ссылка: https://docs.python.org/3/library/concurrent.futures.html