1.selenium是什么?
selenium: - 概念:是一个基于浏览器自动化的模块。 - 和爬虫之间的关联? - 帮我我们便捷的爬取到页面中动态加载出来的数据 - 实现模拟登陆
- 基本使用流程: - pip install selenium - 下载对应的驱动程序:http://chromedriver.storage.googleapis.com/index.html - 实例化一个浏览器对象(将浏览器的驱动程序加载到该对象中) 查看驱动和浏览器版本的映射关系:
-
- http://blog.csdn.net/huilan_same/article/details/51896672
- 无头浏览器: - phantomJs #一般不用这个 - 谷歌无头 重头戏在这个地方 - 如何规避网站对selenium监测的风险
(1)演示程序
前戏:加载驱动程序(下载),下载之前先看一下对应关系
A.选择右上角的三个点
B.选择"帮助",===>3.关于google chrome得到的结果,版本是73,因此我们需要下载驱动v2.46
下载第三个
这个可能需要"蓝灯"进行安装
将下载解压后的文件,放在同级目录下边,
这个时候,我们再次运行同级目录下的文件,就可以实现一个自动化操作了
from selenium import webdriver from time import sleep # 后面是你的浏览器驱动位置,记得前面加r'','r'是防止字符转义的 driver = webdriver.Chrome(r'./chromedriver.exe') # 用get打开百度页面 driver.get("http://www.baidu.com") # 查找页面的“设置”选项,并进行点击 driver.find_elements_by_link_text('设置')[0].click() sleep(2) # # 打开设置后找到“搜索设置”选项,设置为每页显示50条 driver.find_elements_by_link_text('搜索设置')[0].click() sleep(2) # 选中每页显示50条 m = driver.find_element_by_id('nr') sleep(2) m.find_element_by_xpath('//*[@id="nr"]/option[3]').click() m.find_element_by_xpath('.//option[3]').click() sleep(2) # 点击保存设置 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) # 在打开的页面中找到“Selenium - 开源中国社区”,并打开这个页面 driver.find_elements_by_link_text('美女_百度图片')[0].click() sleep(3) # 关闭浏览器 driver.quit()
2.
pip install lxml
from selenium import webdriver from lxml import etree #这个地方报红没有问题 import time bro = webdriver.Chrome(executable_path='./chromedriver.exe') #打开一个空白页 #让浏览器对指定url发起访问 bro.get('http://125.35.6.84:81/xk/') #访问药监总局的网站 #获取浏览器当前打开页面的页面源码数据(可见即可得) page_text = bro.page_source time.sleep(2) tree = etree.HTML(page_text) name = tree.xpath('//*[@id="gzlist"]/li[1]/dl/a/text()')[0] # 获取第一个名字 print(name) time.sleep(3) bro.quit()
得到结果:爬取第一条数据
广州市科馨生物科技有限公司
3.selenium相关的行为动作制定
from selenium import webdriver import time bro = webdriver.Chrome(executable_path='./chromedriver.exe') bro.get('https://www.taobao.com') #(1)节点定位 find系列的方法,定位到标签或者节点 input_text = bro.find_element_by_id('q') #(2)节点交互 input_text.send_keys('苹果') time.sleep(2) #(3)执行js程序(js注入) #滚轮的拖动1屏幕的高度 bro.execute_script('window.scrollTo(0,document.body.scrollHeight)') #(4)点击搜索按钮事件 btn = bro.find_element_by_css_selector('.btn-search') btn.click() time.sleep(3) bro.quit()
4.动作链
from selenium import webdriver #导入动作链对应的模块,具体用到再查看 from selenium.webdriver import ActionChains import time bro = webdriver.Chrome(executable_path='./chromedriver.exe') bro.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable') #如果定位的节点是被包含在iframes节点之中的,则必须使用switch_to进行frame的切换 bro.switch_to.frame('iframeResult') #通过id进行定位 div_tag = bro.find_element_by_id('draggable') #实例化一个动作链对象(需要将浏览器对象作为参数传递给该对象的构造方法) action = ActionChains(bro) #单击且长按 action.click_and_hold(div_tag) for i in range(5): #让div向右移动,移动偏移 action.move_by_offset(17,0).perform() #perform()立即执行动作链 time.sleep(0.5) time.sleep(2) bro.quit()
5.谷歌无头浏览器
from selenium import webdriver from lxml import etree import time from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') bro = webdriver.Chrome(executable_path='./chromedriver.exe',chrome_options=chrome_options) #让浏览器对指定url发起访问 bro.get('http://125.35.6.84:81/xk/') #获取浏览器当前打开页面的页面源码数据(可见即可得) page_text = bro.page_source time.sleep(2) tree = etree.HTML(page_text) name = tree.xpath('//*[@id="gzlist"]/li[1]/dl/a/text()')[0] print(name) time.sleep(3) bro.quit()
示例结果:
广州市科馨生物科技有限公司
6.如何规避网站对selenium检测的风险?
from selenium import webdriver from lxml import etree import time from selenium.webdriver import ChromeOptions option = ChromeOptions() option.add_experimental_option('excludeSwitches', ['enable-automation']) bro = webdriver.Chrome(executable_path='./chromedriver.exe',options=option) #让浏览器对指定url发起访问 bro.get('http://125.35.6.84:81/xk/') #获取浏览器当前打开页面的页面源码数据(可见即可得) page_text = bro.page_source time.sleep(2) tree = etree.HTML(page_text) name = tree.xpath('//*[@id="gzlist"]/li[1]/dl/a/text()')[0] print(name) time.sleep(5) bro.quit()
代码启动,不要轻易再动鼠标
7.qq空间模拟登陆
# Author: studybrother sun import requests from selenium import webdriver from lxml import etree import time driver = webdriver.Chrome(executable_path='./chromedriver.exe') driver.get('https://qzone.qq.com/') # 在web 应用中经常会遇到frame 嵌套页面的应用,使用WebDriver 每次只能在一个页面上识别元素,对于frame 嵌套内的页面上的元素,直接定位是定位是定位不到的。这个时候就需要通过switch_to_frame()方法将当前定位的主体切换了frame 里。 driver.switch_to.frame('login_frame') driver.find_element_by_id('switcher_plogin').click() # driver.find_element_by_id('u').clear() driver.find_element_by_id('u').send_keys('*******') # 这里填写你的QQ号 # driver.find_element_by_id('p').clear() driver.find_element_by_id('p').send_keys('********') # 这里填写你的QQ密码 driver.find_element_by_id('login_button').click() time.sleep(2) # driver.execute_script('window.scrollTo(0,document.body.scrollHeight)') # time.sleep(2) # driver.execute_script('window.scrollTo(0,document.body.scrollHeight)') # time.sleep(2) # driver.execute_script('window.scrollTo(0,document.body.scrollHeight)') # time.sleep(2) # page_text = driver.page_source # # tree = etree.HTML(page_text) # # 执行解析操作 # li_list = tree.xpath('//ul[@id="feed_friend_list"]/li') # for li in li_list: # text_list = li.xpath('.//div[@class="f-info"]//text()|.//div[@class="f-info qz_info_cut"]//text()') # text = ''.join(text_list) # print(text + ' ') driver.close()