Я пишу код на python, который предполагает, что все ссылки, основанные на одном URL-адресе, сохраняются в виде пар ключ: значение (url: [ссылки]), а затем просматривают эти ссылки и делают то же самое с &до тех пор, пока у меня не будет достаточно ключей.
Я уже сделал это со списком потоков и удалил их из списка, когда они закончили работать, но я хочу использовать пул потоков для простоты обслуживания
Для этого я делаю 2 функции:
получить контент из URL и вернуть его
извлечь ссылки из контента и вернутьих
Теперь я хочу управлять этими задачами с помощью пула потоков, но я не знаю, как это сделать правильно, потому что я не знаю, как управлять потоком. Я могу извлечь ссылки только после того, как запрос get вернул html-страницу.
Вот функции, которые я буду использовать:
def extract_links(response):
arr_starts = [m.start() for m in re.finditer('href="https://', response.content)]
arr_ends = []
links = []
for start in arr_starts:
end_index = response.content.find('"', start + 6)
arr_ends.append(end_index)
for i in range(len(arr_starts)):
link = response.content[arr_starts[i] + 6:arr_ends[i]]
links.append(link)
def get_page(url):
return requests.get(url)
, и это код, который я сделал в первый раз:
first_url = r'https://blablabla'
hash_links = {}
thread_list = []
web_crawl(first_url, hash_links)
while len(hash_links.keys()) < 30:
if len(thread_list) < MAX_THREAD_COUNT:
for urls in hash_links.values():
for url in urls:
if url not in hash_links:
new_tread = threading.Thread(target=web_crawl, args=(url, hash_links))
thread_list.append(new_tread)
new_tread.start()
new_tread.join()
else:
for t in thread_list:
if not t.isAlive():
t.handled = True
thread_list = [t for t in thread_list if not t.handled]
for key in hash_links.keys():
print key + ':'
for link in hash_links[key]:
print '----' + link
``