1.selenium是什么?

selenium:
- 概念:是一个基于浏览器自动化的模块。
- 和爬虫之间的关联?
- 帮我我们便捷的爬取到页面中动态加载出来的数据
- 实现模拟登陆
- 基本使用流程:
- pip install selenium
- 下载对应的驱动程序:http://chromedriver.storage.googleapis.com/index.html

- 实例化一个浏览器对象(将浏览器的驱动程序加载到该对象中)
    查看驱动和浏览器版本的映射关系:
- 无头浏览器:
- phantomJs #一般不用这个
- 谷歌无头      重头戏在这个地方

- 如何规避网站对selenium监测的风险

(1)演示程序

前戏:加载驱动程序(下载),下载之前先看一下对应关系

小爬爬4:selenium操作_xml

A.选择右上角的三个点

小爬爬4:selenium操作_xml_02

B.选择"帮助",===>3.关于google chrome得到的结果,版本是73,因此我们需要下载驱动v2.46

 

小爬爬4:selenium操作_数据_03

下载第三个

小爬爬4:selenium操作_数据_04

这个可能需要"蓝灯"进行安装

将下载解压后的文件,放在同级目录下边,

 

小爬爬4:selenium操作_数据_05

这个时候,我们再次运行同级目录下的文件,就可以实现一个自动化操作了

 

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.动作链

小爬爬4:selenium操作_数据_06

 

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()