#python #multithreading #python-requests #threadpool #threadpoolexecutor
#python #многопоточность #python-запросы #threadpool #threadpoolexecutor
Вопрос:
Я очищаю сотни URL-адресов, каждый из которых содержит список данных, которые я хочу, и единственная разница между каждой строкой URL-адреса — это «платформа», «регион» и, наконец, номер страницы. Существует всего несколько платформ и регионов, но номера страниц меняются каждый день, и я не знаю, сколько их. Итак, это первая функция, я просто создаю списки URL-адресов, которые будут запрашиваться параллельно.
Если я использую page= 1, то результат будет содержать ‘table_rows> 0’ в последней функции. Но около page = 500 запрошенный URL-адрес по-прежнему возвращается, но очень медленно, а затем отображается сообщение об ошибке, таблица лидеров не найдена, последняя функция покажет ‘table_rows == 0’ и т. Д. Проблема в том, что мне нужно пройти самую последнюю страницу, и я хочу сделать это быстро, отсюда и threadpoolexecutor — но я не могу отменить все потоки или процессы или что-то еще, как только PAGE_LIMIT отключен. Я бросил исполнителя.завершение работы (cancel_futures=True) просто для того, чтобы показать, что я ищу. Если никто не сможет мне помочь, я с треском удалю распараллеливание и буду медленно, печально очищать один URL-адрес за раз…
Спасибо
from concurrent.futures import ThreadPoolExecutor
from bs4 import BeautifulSoup
import pandas
import requests
PLATFORM = ['xbl', 'psn', 'atvi', 'battlenet']
REGION = ['us', 'ca']
PAGE_LIMIT = True
def leaderboardLister():
global REGION
global PLATFORM
list_url = []
for region in REGION:
for platform in PLATFORM:
for i in range(1,750):
list_url.append('https://cod.tracker.gg/warzone/leaderboards/battle-royale/' platform '/KdRatio?country=' region 'amp;page=' str(i))
leaderboardExecutor(list_url,30)
def leaderboardExecutor(urls,threads):
global PAGE_LIMIT
global INTERNET
if len(urls) > 0:
with ThreadPoolExecutor(max_workers=threads) as executor:
while True:
if PAGE_LIMIT == False:
executor.shutdown(cancel_futures=True)
while INTERNET == False:
try:
print('bad internet')
requests.get("http://google.com")
INTERNET = True
except:
time.sleep(3)
print('waited')
executor.map(scrapeLeaderboardPage, urls)
def scrapeLeaderboardPage(url):
global PAGE_LIMIT
checkInternet()
try:
page = requests.get(url)
soup = BeautifulSoup(page.content,features = 'lxml')
table_rows = soup.find_all('tr')
if len(table_rows) == 0:
PAGE_LIMIT = False
print(url)
else:
pass
print('success')
except:
INTERNET = False
leaderboardLister()
Комментарии:
1. Привет! Мне было интересно, почему вы используете потоки вместо асинхронных запросов?
2. Честно говоря, это меньше кода, и он работал над другим проектом
3. На самом деле он предназначен для того же, что вы хотите сделать. Кроме того, я думаю, что это займет гораздо меньше кода (и проблем), чем код на основе потоков.