Использование Selenium с ipyparallel для веб-очистки

Я все еще очень плохо разбираюсь, и по пути наткнулся на несколько препятствий.

Я хочу распараллелить мой соскоб с помощью ipyparallel, Мой процесс очистки включает использование Selenium, потому что информация, которую я, кажется, получаю, может быть получена только при наличии браузера (я просматривал результаты поиска Google, и я обнаружил, что использование Selenium предоставило данные гораздо больше, чем requests.get), и поскольку мне приходится проводить много поисков, на моем ноутбуке это сказывается (как на памяти, так и на процессоре), поэтому я надеюсь, что смогу снизить нагрузку.

Единственная проблема, когда я пытаюсь реализовать ipp, "webdriver" не найден.

import ipyparallel as ipp
from selenium import webdriver

rc = ipp.Client()
dview = rc[:]

my_urls = [...] # My list of urls

def scrape(url):

    reviews = {Yelp: None, TripAdvisor: None} #How I'll parse search pages

    browser = webdriver.Chrome(driver_path)
    browser.get(url)
    page = BeautifulSoup(browser.page_source, 'lxml')
    browser.quit()
    search_results = page.find_all('div', {'class': 's'}) #The tag for each search result

    for result in search_results:
        if 'yelp' in str(result.findChildren()[1]):
            reviews['Yelp'] = str(result.findChildren()).partition('Rating')[2].split()[1] # TL;DR: How to get the ratings. I tried calling with tags using find, but the results were inconsistent, and this was the only sure-fire way of getting ratings.

        elif 'tripadvisor' in (result.findChildren()[1]):
            reviews['TripAdvisor'] = str(result.findChildren()).partition('Rating')[2].split()[1]

    return reviews

Когда я использую multiprocessing темы, это работает просто отлично, и несколько веб-драйверов появляются одновременно. Тем не менее, когда я использую ipythonparallel и использовать

dview.map(scrape, urls)

Я получаю следующую ошибку

NameError: name 'webdriver' is not defined

Есть ли способ внедрить Selenium в ipyparallel? И, в глубине сути проблемы, есть ли способ эффективно очистить много сайтов одновременно с помощью Selenium? Без какой-либо параллельной обработки, кроме моего собственного устройства, мой ноутбук склонен к сбоям, если слишком много сайтов выполняется одновременно. Сейчас мне нужно использовать веб-драйвер для получения моих данных; requests.get только дает мне небольшую часть отзывов, которые я хочу, в то время как веб-драйверы получают их все (я тестировал список тестов из 100 сайтов; requests.get дает мне 8, а вебдрайверы - 50). Было ли это из-за блокировки сайта или просто из-за того, что страница поиска загружалась динамически, в зависимости от того, используется браузер или нет, мне все еще неясно, но если бы предположение о блокировке большого количества запросов было верным, то веб-драйверы не имели бы работал тоже, но они работали. Я думаю о том, чтобы рассмотреть Scrapy как другую альтернативу, но я не знаю, с чего начать использование пауков Scrapy, не говоря уже о включении Selenium с этими пауками ИЛИ о логистике использования Scrapy с моим проектом, чтобы покрыть все мои URL (например, сколько пауки, как запустить их одновременно и т. д.).

0 ответов

Другие вопросы по тегам