如何在不清除缓存和cookie的情况下使用selenium同时打开多个Firefox实例
How to use selenium to open multiple instances Firefox simultaneously without clearing cache and cookie
我有一个代码可以从 Facebook UID 中抓取好友列表。它有效,但需要很长时间才能抓取整个列表。所以,我想通过使用多处理和 Selenium Grid 来加快速度。以下是我使用的方法:
- 使用帐户登录 Facebook
- 打开 5 个具有相同缓存和 cookie 的 Firefox 实例(所以我不需要再次登录)
- 同时从5个不同的UID中抓取好友列表。 1 instance/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 同时使用多个实例吗?我搜索了很多但不知道如何在我的代码中实现它。谢谢:)
这是另一种不使用 selenium 网格的方法。
这种方法会打开 5 个 firefox 实例,每个实例也会打开 3 个 windows。 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")
复制 cookies 和 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)
然后遍历 uids:
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,请查看:
- Create and upload a file on selenium grid
- How to save and load cookies using python selenium webdriver
- http://selenium-python.readthedocs.io/getting-started.html#selenium-remote-webdriver
这大致意味着 pickle localStorage
和 cookies
并将其传输到每个节点,然后从那里将 cookie 读入每个节点上的每个实例。
我有一个代码可以从 Facebook UID 中抓取好友列表。它有效,但需要很长时间才能抓取整个列表。所以,我想通过使用多处理和 Selenium Grid 来加快速度。以下是我使用的方法:
- 使用帐户登录 Facebook
- 打开 5 个具有相同缓存和 cookie 的 Firefox 实例(所以我不需要再次登录)
- 同时从5个不同的UID中抓取好友列表。 1 instance/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 同时使用多个实例吗?我搜索了很多但不知道如何在我的代码中实现它。谢谢:)
这是另一种不使用 selenium 网格的方法。
这种方法会打开 5 个 firefox 实例,每个实例也会打开 3 个 windows。 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")
复制 cookies 和 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)
然后遍历 uids:
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,请查看:
- Create and upload a file on selenium grid
- How to save and load cookies using python selenium webdriver
- http://selenium-python.readthedocs.io/getting-started.html#selenium-remote-webdriver
这大致意味着 pickle localStorage
和 cookies
并将其传输到每个节点,然后从那里将 cookie 读入每个节点上的每个实例。