1.selenium是什么?
selenium:
- 概念:是一个基于浏览器自动化的模块。
- 和爬虫之间的关联?
- 帮我我们便捷的爬取到页面中动态加载出来的数据
- 实现模拟登陆
- 基本使用流程:
- pip install selenium
- 下载对应的驱动程序:http://chromedriver.storage.googleapis.com/index.html
- 实例化一个浏览器对象(将浏览器的驱动程序加载到该对象中)
查看驱动和浏览器版本的映射关系:
- 无头浏览器:
- 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 + '\n\n\n')
driver.close()