将Selenium与ipyparallel一起用于网络抓取

时间:2018-08-19 10:23:45

标签: python selenium web-scraping ipython-parallel

我对刮刮还很陌生,一路上遇到了一些障碍。

我想使用ipyparallel来并行化抓取。我的抓取过程涉及使用Selenium,因为我似乎只能在存在浏览器的情况下才能获得信息(我正在抓取Google搜索结果,所以我发现使用Selenium所提供的数据远比requests.get ),并且由于我要进行大量搜索,因此这对笔记本电脑造成了巨大的损失(无论是内存方面还是CPU方面),所以我希望可以减轻负担。

唯一的问题是当我尝试实现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线程时,它工作得很好,并且一次出现多个Web驱动程序。但是,当我使用ipythonparallel并使用

dview.map(scrape, urls)

我收到以下错误

NameError: name 'webdriver' is not defined

是否有一种方法可以在ipyparallel中实现Selenium?而且,更深层的问题是,有没有一种方法可以使用Selenium一次有效地刮擦许多站点?如果没有我自己的设备以外的任何并行处理程序,那么一次完成太多站点时,笔记本电脑往往会崩溃。现在,我需要使用网络驱动程序来获取数据。 requests.get仅给出了我想要的评论的一小部分,而Webdriver获得了所有评论(我测试了100个站点的测试列表; requests.get给了我8条评论,而Webdriver给了我50条评论)。我仍然不清楚是由于网站阻塞还是仅根据是否使用浏览器动态地加载搜索页面,但是如果大量请求阻塞的猜测是真的,那么网络驱动程序就不会要么工作,但他们确实工作。我正在考虑将Scrapy用作另一种选择,但我不知道从哪里开始使用Scrapy蜘蛛,更不用说将Selenium与那些蜘蛛合并,或者将Scrapy与我的项目一起使用以覆盖我的所有URL(例如,多少个URL)蜘蛛,如何同时运行等等)。

0 个答案:

没有答案