【问题标题】:How to use selenium to open multiple instances Firefox simultaneously without clearing cache and cookie如何在不清除缓存和cookie的情况下使用selenium同时打开多个Firefox实例
【发布时间】:2016-08-07 19:25:14
【问题描述】:

我有一个从 Facebook UID 中抓取好友列表的代码。它有效,但需要很长时间才能抓取整个列表。所以,我想通过使用多处理和 Selenium Grid 来加速它。以下是我使用的方法:

  1. 用帐号登录 Facebook
  2. 用相同的缓存和cookie打开5个Firefox实例(所以我不需要再次登录)
  3. 同时从 5 个不同的 UID 中抓取好友列表。 1 个实例/1 个 UID

这是我的代码,但它不起作用

import multiprocessing
from selenium.common.exceptions import TimeoutException
from bs4 import BeautifulSoup
from selenium import webdriver

def friend_uid_list(uid, driver):
    driver.get('https://www.facebook.com/' + uid + '/friends')
    //scrape friend list
    target.close()

def g(arg):
    return friend_uid_list(*arg)

if __name__ == '__main__':

    driver = webdriver.Firefox()
    driver.get("https://www.facebook.com/")
    driver.find_element_by_css_selector("#email").send_keys("email@gmail.com")
    driver.find_element_by_css_selector("#pass").send_keys("password")
    driver.find_element_by_css_selector("#u_0_m").click()

    pool = multiprocessing.Pool(5)
    pool.map(g, [(100004159542140,driver),(100004159542140,driver),(100004159542140,driver)])

那么,你能告诉我如何使用 Selenium Grid 同时使用多个实例吗?我搜索了很多,但不知道如何在我的代码中实现它。谢谢你:)

【问题讨论】:

    标签: python selenium cookies selenium-grid


    【解决方案1】:

    这是另一种不使用硒网格的方法。

    这种方法会打开 5 个 firefox 实例,以及每个实例上的 3 个窗口。 cookie 是从主实例复制过来的。

    from pyvirtualdisplay import Display
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    import multiprocessing
    display = Display(visible=0, size=(800, 600))
    display.start()
    d = webdriver.Firefox()
    
    def friend_uid_list(uid, driver):
        values = []
        for handle in driver.window_handles:
            driver.switch_to_window(handle)
            # driver.wait_for_element() etc etc
            values.append(driver.find_element_by_id('#something'))
            # scrape elements
        return values
    
    def g(arg):
        return friend_uid_list(*arg)
    

    启动实例并登录:

    d = webdriver.Firefox()
    d.get("https://www.facebook.com/")
    d.find_element_by_css_selector("#email").send_keys("email@gmail.com")
    d.find_element_by_css_selector("#pass").send_keys("password")
    d.find_element_by_css_selector("#loginbutton").click()
    

    启动多个实例:

    drivers = [webdriver.Firefox(), webdriver.Firefox(), webdriver.Firefox(), webdriver.Firefox()]
    

    复制localStorage

    localstorage_kv = d.execute_script("var obj={};for (var i=0,len=localStorage.length;i<len;++i){obj[localStorage.key(i)]=localStorage.getItem(localStorage.key(i));};return obj")
    

    复制 cookie 和 localStorage:

    for e in drivers:
        e.get("https://www.facebook.com/")
        for x in d.get_cookies():
            e.add_cookie(x)
        for k, v in localstorage_kv.items():
            e.execute_script('localStorage.setItem("{}", {})'.format(k,v))
        e.refresh() # should be logged in now
    

    将初始驱动程序重新添加到驱动程序数组中:

    drivers.append(d)
    

    然后循环遍历uid:

    uids = [100004159542140, 100004159542140, 100004159542140, 100004159542140, 100004159542140, 100004159542140]
    pool = multiprocessing.Pool(5)
    
    while uids:
        for driver in drivers:
            if len(driver.window_handles) == 1:
                driver.execute_script('window.open("https://www.facebook.com/' + uids.pop() + '/friends")')            
                driver.execute_script('window.open("https://www.facebook.com/' + uids.pop() + '/friends")')            
            else:
                for handle in driver.window_handles:
                    handle.get("https://www.facebook.com/" + uids.pop() + "/friends")
        return_values = pool.map(g, drivers)
        import pdb;pdb.set_trace()
    

    如果您真的想在 selenium 网格上的节点之间共享 cookie,请查看:

    这大致意味着腌制localStoragecookies并将其传输到每个节点,然后从那里将cookie读入每个节点上的每个实例。

    【讨论】:

    • 你好,当我运行代码“ImportError: No module named 'selenium.common.keys'”时显示错误
    • @NGuyen 会更新,应该是selenium.webdriver.common.keys
    • 谢谢,但我又得到一个错误:easyprocess.EasyProcessCheckInstalledError: cmd=['Xvfb', '-help'] OSError=[WinError 2] 系统找不到指定的文件 程序安装错误!
    • 我用的是win10 64bit
    • 没有必要使用xvfb,但如果你想无头运行它,这是一个不错的方法。查看xvfbwrapper
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多