我想解析一个有多个页面的网站。
我不知道页数。 这是原始代码:
next_button=soup.find_all('a',{'class':"btn-page_nav right"})
while next_button:
link=next_button[0]['href']
resp=requests.get('webpage+link)
soup=BeautifulSoup(resp.content)
table=soup.find('table',{'class':'js-searchresults'})
body=table.find('tbody')
rows=body.find_all('tr')
function(rows)
next_button=soup.find_all('a',{'class':"btn-page_nav right"})
它工作正常,function(rows)
是一个解析每个页面的一部分的函数。
我想要做的是使用multiprocessing
来解析这些页面。我考虑过使用pool
3个工作人员,这样我就可以同时处理3个页面,但我无法弄清楚如何实现它。
一个解决方案就是:
rows_list=[]
next_button=soup.find_all('a',{'class':"btn-page_nav right"})
while next_button:
link=next_button[0]['href']
resp=requests.get('webpage+link)
soup=BeautifulSoup(resp.content)
table=soup.find('table',{'class':'js-searchresults'})
body=table.find('tbody')
rows=body.find_all('tr')
rows_list.append(rows)
next_button=soup.find_all('a',{'class':"btn-page_nav right"})
等待程序遍历所有页面然后:
pool=multiprocessing.Pool(processes=4)
pool.map(function,rows_list)
但是我不认为这会增加太多的性能,我希望主要过程循环遍历页面,一旦打开页面,就将其发送给工作人员。 如何做到这一点?一个虚拟的例子:
pool=multiprocessing.Pool(processes=4)
next_button=soup.find_all('a',{'class':"btn-page_nav right"})
while next_button:
link=next_button[0]['href']
resp=requests.get('webpage+link)
soup=BeautifulSoup(resp.content)
table=soup.find('table',{'class':'js-searchresults'})
body=table.find('tbody')
rows=body.find_all('tr')
**pool.send_to_idle_worker(rows)**
next_button=soup.find_all('a',{'class':"btn-page_nav right"})
答案 0 :(得分:0)
您可以使用Pool.apply_async()
代替Pool.map()
吗? Apply_async不会阻止,并允许主程序继续处理更多行。它也不需要您的主程序准备好映射所有数据。您只需将一个块作为参数传递给apply_async()
。