由于 PhantomJS 已经不会再更新,所以基于模拟器爬虫应该使用浏览器应该是 Chrome 或者 Firefox。 配合Python + Selenium + Chrome(FireFox ),尝试获取元素、点击、等待、整页截图等 UI 操作。 需要注意的是不管是 Chrome 还是 Firefox,他们都有通用的地方,也有各自特定的部分,需要掌握查看对应浏览器 API 的方法才能完全掌握。 整套学习自学教程中应用的数据都是《三國志》、《真·三國無雙》系列游戏中的内容。 开发环境
三方包安装。 pip install selenium 在 Selenium 和 浏览器(Chrome、FireFox)之间,需要一个 WebDriver 驱动(ChromeDriver、FireFoxDriver)。 安装 ChromeDriver 驱动从 chromedriver 驱动 下载与操作系统匹配的 ChromeDriver 驱动。 安装 FireFox 驱动从 FireFox 驱动 下载与操作系统匹配的 ChromeDriver 驱动。 浏览器指定环境变量谷歌浏览器驱动环境指定。
火狐浏览器驱动环境指定。 geckodriver 压缩包解压后将 geckodriver.exe 复制到火狐浏览器目录下。 使用注意事项Python+Selenium 是一种用于自动 Web 测试和抓取的技术。尤其是在抓取时,需要考虑数据版权问题、服务器负载、各种规则(会员登录时的会员规则等)。 例如 京东、淘宝 等使用条款可能明确禁止抓取,或者 robots.txt 可能禁止抓取。 使用测试非无头模式测试运行 ChromeDriver 官方网站上的 Getting Started 中的示例代码 。 Chrome 将启动,5 秒后将使用 ChromeDriver 执行 百度搜索。(Chrome 窗口显示Chrome 由自动化测试软件控制。)再过 5 秒会自动关闭。 import timefrom selenium import webdriverdriver = webdriver.Chrome(chrome)driver.get('https://www.baidu.com/')time.sleep(5)search_box = driver.find_element_by_name('wd')search_box.send_keys('ChromeDriver')search_box.submit()time.sleep(5)driver.quit() 无头模式测试通过 options 配置在浏览网页时不弹出浏览器操作。
获取元素页面中的元素可以通过ID、类名、标签名、链接的innerText、CSS选择器、XPath来获取。 加载和使用浏览器驱动配置信息。 import warningswarnings.filterwarnings('ignore')import timefrom selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.chrome.options import Optionschrome=R'xxxxx/WebDrivers/chromedriver_win32/chromedriver.exe'driver = webdriver.Chrome(chrome) driver.get('https://www.baidu.com/') CSS 选择器可以使用 .text 来检索
Link Text 选择器使用 link text 选择器定位包含字符的链接框,其中字符必须完全匹配。 for a in driver.find_elements_by_link_text('京公网安备11000002000001号'): print(a.get_attribute('href'))http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11000002000001 Partial Link Text 选择器使用 link text 选择器定位包含字符的链接框,其中字符可以部分匹配。
基于搜索框进行定位的多种方法。 ID 选择器使用 id 选择器定位搜索框。 driver.find_elements_by_id('kw')[<selenium.webdriver.remote.webelement.WebElement (session='09fae20483f23fafa76a608eaa78f696', element='69a6e166-0585-49a5-a270-425f4934fd49')>] Class Name 选择器使用 class name 选择器定位搜索框。
Tag Name 选择器使用 tag name 选择器定位搜索框。 driver.find_element_by_tag_name('input')<selenium.webdriver.remote.webelement.WebElement (session='09fae20483f23fafa76a608eaa78f696', element='e848177c-372f-46d7-93f4-0579a9bbfeb8')> Name 选择器使用 name 选择器定位搜索框。
XPath 选择器使用 name 选择器定位搜索框。这个功能最简单,使用浏览器自带的搜索功能即可。 driver.find_elements_by_xpath('//*[@id='kw']')[<selenium.webdriver.remote.webelement.WebElement (session='09fae20483f23fafa76a608eaa78f696', element='69a6e166-0585-49a5-a270-425f4934fd49')>] 也可以进行关键信息的定位查找。
检查元素的状态可以使用以下方法检查找到的元素的状态。
text_field.is_displayed() # 判断元素是否显示driver.find_element_by_name('xxx').is_enabled() # 判断button是否显示driver.find_element_by_class_name('btn').is_enabled()driver.find_element_by_class_name('btn').is_selected() # 判断button是否被选中 用户操作定位选择上面已经介绍了通过 id、class name、tag name 、name 以及 xpath 定位搜索框。 信息输入 input用于在文本字段或文本区域中输入字符串send_keys()。
点击 click使用 .click() 可以单击检索到的元素。 driver.find_elements_by_xpath('//*[@id='su']')[0].click() 提交 submit功能相同于 driver.find_element_by_id('submit').click() 单击提交按钮等。
鼠标悬停动作将鼠标悬停到指定的位置。 from selenium.webdriver.common.action_chains import ActionChainsactions = ActionChains(driver)actions.move_to_element( driver.find_element_by_class_name('c-gap-top-small')).perform() 鼠标拖放此功能用于页面内功能模块的拖动。
页面和窗口间移动页面间移动driver.get(URL) # 打开指定页面driver.forward() # 页面前进driver.back() # 页面后退driver.refresh() # 浏览器刷新 移动到 window 或 frame
响应弹出对话框访问弹出的对话框。 driver.switch_to_alert() 浏览器等待某些页面操作需要等待检查元素的存在和状态。 明确指定条件使用 expected_conditions 方法实现。
隐式等待时间如果无法立即找到元素,则指定等待时间(轮询时间),默认值为 0。 driver.implicitly_wait(秒数) 指定等待时间使用 time.sleep(秒数) 的方法,以免服务器超载。 浏览器屏幕操作调整大小和滚动条。并且使用 driver.execute_script(...) 可以运行 JavaScript 相关功能。
调整浏览器窗口大小从 options 配置浏览器窗口大小。 options.add_argument('--window-size=800,600')options.add_argument('--start-maximized') # 最大化显示options.add_argument('--start-fullscreen') # 全屏幕显示 隐藏滚动条
截图操作在无头模式下,截取整个搜索结果页面的屏幕截图。 import warningswarnings.filterwarnings('ignore')import timefrom selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.chrome.options import Optionschrome=R'xxxxx/WebDrivers/chromedriver_win32/chromedriver.exe'driver = webdriver.Chrome(chrome,options=options) driver.get('https://www.baidu.com/')driver.find_element_by_name('wd').send_keys('python', Keys.RETURN)width = driver.execute_script('return document.body.scrollWidth;')height = driver.execute_script('return document.body.scrollHeight;')driver.set_window_size(width, height)driver.save_screenshot('screenshot-full.png')True 浏览器的关闭与退出关闭当前焦点所在的浏览器窗口。
关闭所有浏览器窗口并终止其 WebDriver 会话。 driver.quit() 浏览器 cookie获得 cookie 。
追加 cookie 。 driver.add_cookie({'name':'key', 'value':'value'}) 删除 cookie 。
浏览器代理ids=['xxx.xxx.xxx.xxx:xxxx']opt = webdriver.ChromeOptions()opt.add_argument('--proxy-server=http://{}'.format(id)) # 添加代理 |
|