Асинхронный скребок с красивым супом, grequests - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь извлечь некоторую информацию из списка URL-адресов и хочу сделать это асинхронно, чтобы сэкономить время. Я могу получить информацию, которую я хотел бы, когда я делаю это синхронно, и соответствующая часть этого кода, по существу, такова:

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)

, но я не получаю текстовые элементы , Я просто получаю полный список всех этих деталей на этой странице. Результат выглядит так (я не смог захватить весь вывод, но это длинный список, содержащий всю необходимую мне информацию, но я не могу извлечь нужные текстовые элементы c, которые я обвел, которые являются просто именами и числом в скобках):

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 голосов
/ 17 июня 2020

Вы можете использовать многопроцессорную обработку 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()
...