我正在尝试从网址列表中抓取一些信息,并且希望异步执行以节省时间。当我同步进行操作时,我可以获得所需的信息,而该代码的相关部分基本上是这样的:
links = [...] #list of links
for link in links:
source_race = requests.get(link).text
soup_race = BeautifulSoup(source_race,'lxml')
contestant_names = []
for contestants in soup_race.find_all('div',attrs={'data-automation-id':'racecard-outcome-name'}):
contestant_names.append(contestants.text.replace('\xa0',' '))
这将为我返回参赛者姓名列表,这正是我想要的。
现在,当我尝试异步执行此操作时,我正在使用打印功能进行初步测试,如下所示:
reqs = (grequests.get(link) for link in links)
resp = grequests.map(reqs)
for r in resp:
soup = BeautifulSoup(r.text, 'lxml')
results = soup.find_all('div',attrs={'data-automation-id':'racecard-outcome-name'})
print(results)
但是我没有得到文本项,我只是得到了该页面上所有这些细节的完整列表。输出看起来像(我无法捕获整个输出,但是它是一个很长的列表,其中包含我想要的所有信息,但是我无法提取我想要圈出的特定文本项,它们只是名称和括号中的数字):
当我尝试放print(results.text)
时,出现以下错误:
当我将上面的代码更改为find
而不是find_all
并使用print(results.text)
时,我得到的正是我期望的(并且想要的),即:
我只需要一种打印出所有跑步者姓名的方法。
我是异步网络爬虫(和一般而言的网络爬虫)的新手,因此,如果其中任何一个不清楚,我感到抱歉。
答案 0 :(得分:0)
您可以使用10个异步执行的多处理链接。 我的伪代码:
from multiprocessing import Pool
def scrape(url):
source_race = requests.get(url).text
soup_race = BeautifulSoup(source_race,'lxml')
contestant_names = []
for contestants in soup_race.find_all('div',attrs={'data-automation-id':'racecard-outcome-name'}):
contestant_names.append(contestants.text.replace('\xa0',' '))
links = []
p = Pool(10)
p.map(scrape, links)
p.terminate()
p.join()