浅谈自动化爬虫场景下的数据持久化
每次我们使用 selenium 或 Pyppeteer 打开的时候都是一个新的空白的浏览器。而且如果遇到了需要登录的网页之后,如果我们这次登录上了,下一次再启动又是空白了,又得登录一次,这的确是一个问题。
比如以淘宝举例,平时我们逛淘宝的时候,在很多情况下关闭了浏览器再打开,淘宝依然还是登录状态。这是因为淘宝的一些关键 Cookies 已经保存到本地了,下次登录的时候可以直接读取并保持登录状态。
那么这些信息保存在哪里了呢?其实就是保存在用户目录下了,里面不仅包含了浏览器的基本配置信息,还有一些 Cache、Cookies 等各种信息都在里面,如果我们能在浏览器启动的时候读取这些信息,那么启动的时候就可以恢复一些历史记录甚至一些登录状态信息了。
这也就解决了一个问题:很多时候你在每次启动 Selenium 或 Pyppeteer 的时候总是一个全新的浏览器,那这究其原因就是「没有设置用户目录」,如果设置了它,每次打开就不再是一个全新的浏览器了,它可以恢复之前的历史记录,也可以恢复很多网站的登录信息。
Chrome浏览器的可执行文件路径,通过地址栏输入chrome://version
获得,如设为如下路径则为加载整个浏览器的用户数据信息,或者自定义设置一个路径也可以。
selenium设置用户数据目录
from seleium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--user-data-dir=/Users/billie/Library/Application Support/Google/Chrome/default')
driver = webdriver.Chrome(options=options)
pyppeteer设置用户数据目录
import pyppeteer
import asyncio
async def main():
browser = await pyppeteer.launch(
headless=False,
userDataDir='/Users/billie/Library/Application Support/Google/Chrome/default')
page = await browser.newPage()
asyncio.sleep(100)
asyncio.get_event_loop().run_until_complete(main())
具体的介绍可以看官方的一些说明,如: user_data_dir.md,这里面介绍了 userdatadir 的相关内容。
除了设置用户数据目录,还有一些方法可以达到保持或加载登录状态的效果,如:
- 使用cookies - 使用selenium登录雨课堂并获取课程信息
- 开启一个调试专用的浏览器,如下
selenium控制调试专用的浏览器
在使用selenium进行自动化测试中我们有时会遇到这样的情况:
我们需要手动打开浏览器,进入到所需的页面,执行一些手动任务,如输入表单、输入验证码,登陆成功后,然后再开始运行自动化脚本。
这种情况下如何使用selenium来接管先前已打开的浏览器呢?
我们可以利用Chrome DevTools协议。它允许客户检查和调试Chrome浏览器。
启动浏览器
Chrome浏览器的可执行文件路径,通过地址栏输入chrome://version
获得:
-
Windows
chrome_path = 'C:\\Users\\Billie\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe' # chrome.exe所在目录,注:双斜杠 os.system(f'start {chrome_path} --remote-debugging-port=9222 --user-data-dir="C:\\selenium_ui_auto\\chrome_temp"') # 注:双斜杆;start
-
macOS
chrome_path = '/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome' os.system(f'{chrome_path} --remote-debugging-port=9222 --user-data-dir="~/ChromeProfile";')
捕获浏览器对象
options = Options()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(options=options) # 如浏览器不存在,则会在约一分钟等待之后,报错-WebDriverException