selenium基础操作
selenium
概览:基于浏览器自动化的模块
自动化:可以通过代码指定一些列的行为动作,然后将其作用到浏览器。
安装:pip install selenium
selenium和爬虫之间的关联
- 便捷的捕获到任意形式动态加载的数据(可见即可得)
- 实现模拟登录
实例:
需求:打开京东后搜索文本框在输入iphoneX后点击搜索,进入到搜索页面后将滚轮滑动到浏览器最底部
#!/usr/bin/env python # -*- coding: utf-8 -*- # author: 青城子 # datetime: 2021/7/18 16:15 # ide: PyCharm from selenium import webdriver from time import sleep # 基于浏览器的驱动程序实例化一个浏览器对象 bro = webdriver.Chrome() # 对目的网站发起请求 bro.get("https://www.jd.com/") # 标签定位 # send_keys()向定位标签中录入数据 bro.find_element_by_xpath('//*[@id="key"]').send_keys("iphoneX") bro.find_element_by_xpath('//*[@id="search"]/div/div[2]/button').click() sleep(2) # 在搜索结果页面进行滚动操作,(执行js操作,即js注入) bro.execute_script('window.scrollTo(0,document.body.scrollHeight)') sleep(2) bro.quit()
百度例子:
#!/usr/bin/env python # -*- coding: utf-8 -*- # author: 青城子 # datetime: 2021/7/18 16:15 # ide: PyCharm from selenium import webdriver from time import sleep # 基于浏览器的驱动程序实例化一个浏览器对象 driver = webdriver.Chrome() driver.maximize_window() # 用get打开百度页面 driver.get("https://www.baidu.com/") # 查找页面的【设置】选项,并进行点击 driver.find_element_by_xpath('//*[@id="s-usersetting-top"]').click() sleep(2) # 打开设置后找到【搜索设置】选项,设置每页显示50条 driver.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[1]').click() sleep(2) # 设置50条 driver.find_element_by_xpath('//*[@id="nr_3"]').click() # 点击保存设置 driver.find_elements_by_class_name("prefpanelgo")[0].click() sleep(2) # 处理弹出的警告页面,确定accept() 和 取消dismiss() driver.switch_to.alert.accept() sleep(2) # 找到百度输入框,并输入美女 driver.find_element_by_id("kw").send_keys("美女") sleep(2) # 点击搜索按钮 driver.find_element_by_id('su').click() sleep(2) # 打开的页面中找到美女,点击第一张美女图片进入详情页面 driver.find_element_by_xpath('//*[@id="1"]/div/div[1]/div/div[1]/a[1]/img').click() sleep(3) # 关闭浏览器 driver.quit()
如何捕获动态加载的数据
药监总局为例:http://scxk.nmpa.gov.cn:81/xk/
获取前三页所有企业名称
#!/usr/bin/env python # -*- coding: utf-8 -*- # author: 青城子 # datetime: 2021/7/18 17:11 # ide: PyCharm from selenium import webdriver from time import sleep from lxml import etree url = "http://scxk.nmpa.gov.cn:81/xk/" driver = webdriver.Chrome() driver.maximize_window() driver.get(url) page_text_list = [] # 每一页的页面源码数据 sleep(1) # 捕获到当前(第一页)页面对应的页面源码数据 page_text = driver.page_source # 当前页面全部加载完毕后对应的页面源码数据 page_text_list.append(page_text) # 点击下一页(即第2页和第3页) for i in range(2): next_page = driver.find_element_by_xpath('//*[@id="pageIto_next"]').click() sleep(1) page_text_list.append(driver.page_source) for page_text in page_text_list: tree = etree.HTML(page_text) li_list = tree.xpath('//*[@id="gzlist"]/li') for li in li_list: name = li.xpath("./dl/@title")[0] print(name) sleep(2) driver.quit()
selenium的缺点
- 效率低
动作链ActionChains
动作链:一系列连续的动作(滑动动作)
#!/usr/bin/env python # -*- coding: utf-8 -*- # author: 青城子 # datetime: 2021/7/18 17:34 # ide: PyCharm from time import sleep from selenium import webdriver from selenium.webdriver import ActionChains # 动作链 from lxml import etree url = "https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable" driver = webdriver.Chrome() driver.maximize_window() driver.get(url) sleep(1) # 如果通过find系列的函数进行标签定位,如果标签是存在于iframe下面,则会定位失败 # 解决方案:使用switch_to即可 driver.switch_to.frame("iframeResult") div_tag = driver.find_element_by_xpath('//*[@id="draggable"]') # print(div_tag) # 对div_tag进行滑动操作 action = ActionChains(driver) # 实例化动作链,传入浏览器对象,让动作链和当前浏览器产生关联 action.click_and_hold(div_tag) # 点击且长按,传入需要长按的参数对象 for i in range(6): # perform()让动作链立即执行 action.move_by_offset(10, 15).perform() # 偏移右下角 ,向右偏移10个像素,向下偏移15个像素 sleep(0.5) action.release() # 释放 driver.close()
无头浏览器
无可视化界面的浏览器 : 谷歌无头浏览器(推荐)、phantomJS
需求:使用谷歌无头浏览器访问百度页面,且将百度页面截图保存到本地
#!/usr/bin/env python # -*- coding: utf-8 -*- # author: 青城子 # datetime: 2021/7/18 18:10 # ide: PyCharm from selenium import webdriver from selenium.webdriver.chrome.options import Options from time import sleep # 创建一个参数对象,用例控制chrom以无界面模式打开 # 固定写法 chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') driver = webdriver.Chrome(options=chrome_options) driver.maximize_window() driver.get("https://www.baidu.com/") sleep(3) # 截图 driver.save_screenshot("baidu.png") print(driver.page_source) print(driver.current_url)
如何让selenium规避检测
有的网站会检测请求是否为selenium发起,如果是则让该次请求失败;
规避检测的方法:
selenium接管chrome浏览器
实现步骤:
1、必须将电脑中安装谷歌浏览器的启动程序所在的目录找到,且将目录添加到环境变量中。
2、打开cmd,在命令行输入命令:- chrome.exe --remote-debugging-port=9222 --user-data-dir="空文件夹目录"
指定执行结束后,会打开本机安装好的谷歌浏览器。
3、执行如下代码:使用下面代码接管步骤2打开的真实的浏览器。
#!/usr/bin/env python # -*- coding: utf-8 -*- # author: 青城子 # datetime: 2022/2/7 13:27 # ide: PyCharm from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222") # 本机安装谷歌浏览器驱动程序路径 chrome_driver = "C:\Python\Python37\chromedriver" driver = webdriver.Chrome(chrome_driver, chrome_options=chrome_options) print(driver.title)