Python Can';t停止线程池执行器
我正在抓取数百个url,每个url都有我想要的数据排行榜,每个url字符串之间唯一的区别是“平台”、“区域”,最后是页码。只有几个平台和地区,但页码每天都在变化,我不知道有多少。这是第一个函数,我只是创建要并行请求的URL列表 如果我使用page=1,那么结果将在最后一个函数中包含“table_rows>0”。但是在page=500左右,请求的url仍会ping回来,但速度非常慢,然后会显示一条错误消息,找不到排行榜,最后一个函数会显示“table_rows==0”,等等。问题是我需要快速浏览最后一页,因此是threadpoolexecutor,但一旦页面限制被触发,我不能取消所有线程或进程或任何内容。我抛出executor.shutdown(cancel\u futures=True)只是为了显示我在寻找什么。如果没有人能帮助我,我会痛苦地删除并行化,我会慢慢地,悲哀地,一次只抓取一个url 谢谢Python Can';t停止线程池执行器,python,multithreading,python-requests,threadpool,threadpoolexecutor,Python,Multithreading,Python Requests,Threadpool,Threadpoolexecutor,我正在抓取数百个url,每个url都有我想要的数据排行榜,每个url字符串之间唯一的区别是“平台”、“区域”,最后是页码。只有几个平台和地区,但页码每天都在变化,我不知道有多少。这是第一个函数,我只是创建要并行请求的URL列表 如果我使用page=1,那么结果将在最后一个函数中包含“table_rows>0”。但是在page=500左右,请求的url仍会ping回来,但速度非常慢,然后会显示一条错误消息,找不到排行榜,最后一个函数会显示“table_rows==0”,等等。问题是我需要快速浏览最
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 + '&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()
你好我想知道为什么你使用线程而不是异步请求?老实说,它的代码更少,而且它在不同的项目上工作,实际上它;它是为你想做的事情而设计的。另外,我认为与基于线程的代码相比,它所需的代码(和问题)要少得多。