我正在用python写一个代码,该代码想获取所有在一个url中建立的链接,将它们另存为key:value对(url:[links]),然后遍历这些链接并在&上做同样的事情直到我得到足够的钥匙。
我已经使用线程列表完成了此操作,并在线程运行完毕后将其从列表中删除,但是我想使用线程池来简化维护
为此,我提供2个功能:
从网址中获取内容并返回
从内容中提取链接并返回它们
现在,我想使用线程池来管理这些任务,但是我不知道如何正确地执行它,因为我不知道如何控制流程。 我只能在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
``
答案 0 :(得分:0)
您的问题似乎是从URL生成内容,然后将在URL中找到的链接作为键进行处理,还计划对这些链接进行处理,但是使用线程池和信号量对象并行进行。
如果是这样,我将为您提供信号量对象和线程池的this article。
另外,您的问题对我来说听起来很像可以从生产者-消费者体系结构中受益的事物,因此我也建议使用this article。