Многопоточность — Откройте URL-адрес из фрейма данных с помощью selenium и очистите его с помощью beautifulsoup

#python #pandas #multithreading #selenium #beautifulsoup

Вопрос:

Я написал код для проверки фрагмента текста на основе соскобленной информации, используя приведенный ниже код. Однако я не знаю, как выполнить многопоточное выполнение. Я действительно ценю любое предложение по решению этой проблемы.

Заранее спасибо.

 import requests
from bs4 import BeautifulSoup
from selenium import webdriver
import time 
headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
        'referer': 'https://www.google.com/'
        }
data = {'RefNo':  [2001, 2002,2003,2004],
        'link': ['https://www.google.com/search?amp;q=Python', 'https://www.google.com/search?amp;q=Java','https://www.google.com/search?amp;q=Visual Basic','https://www.google.com/search?amp;q=c']
        }

df = pd.DataFrame (data, columns = ['RefNo','link'])

for index, row in df.iloc[0:].iterrows():
    dr = webdriver.Chrome("/Users/synup/Desktop/Python/chromedriver")
    dr.get(row['link'])
    soup = BeautifulSoup(dr.page_source, 'html.parser')
    for content in soup.find_all('div',attrs={"data-attrid":"subtitle"}):
        if (content.text=='Programming language'):
            print(row['RefNo'],row['link'])
    dr.quit()


 

Комментарии:

1. Вы можете использовать concurrent.futures: docs.python.org/3/library/concurrent.futures.html .

2. Вот пример: with ThreadPoolExecutor() as executor: future = executor.submit(function, parameters) print(future.result()) #prints the output

3. Спасибо @Kral. Я пробовал это, но я не знаю, как передать 2 столбца фрейма данных.

4. Вы можете попытаться передать их в виде tupe или списка: executor.submit(function, [df]) . Я полагаю, что функция отправки также допускает несколько аргументов, таких как: submit(fn, /, *args, **kwargs)

5. Спасибо, что это сработало!