异步Web抓取漂亮的汤,grequests

时间:2020-06-16 23:52:29

标签: python asynchronous web-scraping grequests

我正在尝试从网址列表中抓取一些信息,并且希望异步执行以节省时间。当我同步进行操作时,我可以获得所需的信息,而该代码的相关部分基本上是这样的:

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)

但是我没有得到文本项,我只是得到了该页面上所有这些细节的完整列表。输出看起来像(我无法捕获整个输出,但是它是一个很长的列表,其中包含我想要的所有信息,但是我无法提取我想要圈出的特定文本项,它们只是名称和括号中的数字):

Portion of the output

second potion of the output

当我尝试放print(results.text)时,出现以下错误:

first error message

当我将上面的代码更改为find而不是find_all并使用print(results.text)时,我得到的正是我期望的(并且想要的),即:

one correct output

我只需要一种打印出所有跑步者姓名的方法。

我是异步网络爬虫(和一般而言的网络爬虫)的新手,因此,如果其中任何一个不清楚,我感到抱歉。

1 个答案:

答案 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()