11. python爬虫——selenium模块综合使用教程

python爬虫——selenium模块综合使用教程

  • 1、selenium模块和爬虫之间的关联
  • 2、selenium使用流程
    • (1)环境安装
    • (2)下载浏览器的驱动程序
    • (3)实例化一个浏览器对象
    • (4)编写基于浏览器自动化的操作代码
  • 3、selenium基本操作使用示例:
    • (1)获取网页数据
    • (2)实现点击搜索按钮
    • (3)实现滚轮滚动效果
    • (4)实现前进、回退效果
  • 4、selenium处理iframe
    • 模拟登陆QQ空间
  • 5、selenium无头浏览器规避检测

1、selenium模块和爬虫之间的关联

  • 便捷的获取网站中动态加载的数据
  • 便捷的实现模拟登陆

selenium模块是基于浏览器自动化的一个模块。

2、selenium使用流程

(1)环境安装

  • pip install selenium

(2)下载浏览器的驱动程序

  • 谷歌浏览器的驱动程序下载
  • 关于Chrome和Chromedriver关系的对照表

注:win32版本可兼容64

(3)实例化一个浏览器对象

(4)编写基于浏览器自动化的操作代码

  • 发起请求:get(url)
  • 标签定位:find系列的方法
  • 标签交互:send_keys(‘xxxx’)
  • 执行js程序:execute_script(‘jsCode’)
  • 前进,后退:back(),forward()
  • 关闭浏览器:quit() / close()

3、selenium基本操作使用示例:

下载完驱动后,将.exe文件放入与.py文件同一个文件夹下

(1)获取网页数据

  • 需求:爬取古诗名
    https://www.gushiwen.org/gushi/tangshi.aspx
    11. python爬虫——selenium模块综合使用教程_第1张图片
  • 代码
from selenium import webdriver
from lxml import etree
from time import sleep

#实例化一个浏览器对象(传入浏览器的驱动程序)
bro = webdriver.Chrome(executable_path='./chromedriver')

#让浏览器发起一个指定url对应请求
bro.get('https://www.gushiwen.org/gushi/tangshi.aspx')

#获取浏览器当前页面的页面源码数据
page_text = bro.page_source

#解析企业名称
tree = etree.HTML(page_text)
span_list = tree.xpath('//div[@class="sons"]/div[1]/span')


for span in span_list:
    name = span.xpath('./a/text()')[0]
    print(name)

sleep(5)
bro.quit()

(2)实现点击搜索按钮

  • 需求:页面上实现在搜索框上输入Iphone并点击搜索
    11. python爬虫——selenium模块综合使用教程_第2张图片

  • 代码

from selenium import webdriver
from lxml import etree
from time import sleep


bro = webdriver.Chrome(executable_path='./chromedriver')
bro.get('https://www.taobao.com/')

#标签定位
search_input = bro.find_element_by_id('q')
#标签交互
search_input.send_keys('Iphone')

#点击搜索按钮
btn = bro.find_element_by_css_selector('.btn-search')
btn.click()

sleep(5)

bro.close()

(3)实现滚轮滚动效果

  • 需求:实现在开发者工具中的Console输入js代码相同的滚轮滚动效果
    11. python爬虫——selenium模块综合使用教程_第3张图片
  • 代码
from selenium import webdriver
from lxml import etree
from time import sleep


bro = webdriver.Chrome(executable_path='./chromedriver')
bro.get('https://www.taobao.com/')

bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
sleep(5)

bro.quit()

(4)实现前进、回退效果

  • 需求:实现先进入淘宝,再进入百度。之后回退到淘宝,再前进进入百度。
    11. python爬虫——selenium模块综合使用教程_第4张图片
  • 代码
from selenium import webdriver
from lxml import etree
from time import sleep

bro = webdriver.Chrome(executable_path='./chromedriver')
bro.get('https://www.taobao.com/')
bro.get('https://www.baidu.com')
# 回退
bro.back()
sleep(2)
# 前进
bro.forward()
sleep(2)

bro.close()

4、selenium处理iframe

  • 如果定位的标签存在于iframe标签中,则必须使用switch_to.frame(id)

  • 动作链(拖动):
    from selenium.webdriver import ActionChains

    • 实例化一个动作链对象:
      action = ActionChains(bro)
    • 触发长按且点击操作:
      click_and_hold(div)
    • 确定偏移值:
      move_by_offset(x,y)
    • 执行动作链:
      perform()
    • 释放动作链对象:
      action.release()
  • 代码

from selenium import webdriver
from time import sleep
#导入动作链对应的类
from selenium.webdriver import ActionChains
bro = webdriver.Chrome(executable_path='./chromedriver')

bro.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')

#如果定位的标签是存在于iframe标签之中的则必须通过如下操作在进行标签定位
bro.switch_to.frame('iframeResult')#切换浏览器标签定位的作用域
div = bro.find_element_by_id('draggable')

#动作链
action = ActionChains(bro)
#点击长按指定的标签
action.click_and_hold(div)

for i in range(5):
    #perform()立即执行动作链操作
    #move_by_offset(x,y):x水平方向 y竖直方向
    action.move_by_offset(17,0).perform()
    sleep(0.5)

#释放动作链
action.release()

bro.quit()

模拟登陆QQ空间

  • 需求:
    (1)登陆QQ空间
    (2)点击账号密码登陆:a.切换至对应的frame;b.获取该frame下的标签
    (3)输入账号,输入密码,点击的呢轮毂

11. python爬虫——selenium模块综合使用教程_第5张图片

  • 代码
from selenium import webdriver
from time import sleep

bro = webdriver.Chrome(executable_path='./chromedriver')
bro.get('https://qzone.qq.com/')

bro.switch_to.frame('login_frame')

a_tag = bro.find_element_by_id("switcher_plogin")
a_tag.click()

userName_tag = bro.find_element_by_id('u')
passName_tag = bro.find_element_by_id('p')
sleep(1)
userName_tag.send_keys('123456789')
sleep(1)
passName_tag.send_keys('987654321')
sleep(1)
btn = bro.find_element_by_id('login_button')
btn.click()

sleep(1)
bro.close()

5、selenium无头浏览器规避检测

  • 需求:实现使用selenium时无可视化界面并且可以规避检测(反反爬虫机制)

  • 代码

from selenium import webdriver
from time import sleep
# 实现无可视化界面
from selenium.webdriver.chrome.options import Options
# 实现规避检测
from selenium.webdriver import ChromeOptions


#实现无可视化界面的操作
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')


# 实现规避检测
option = ChromeOptions()
option.add_experimental_option('excludeSwitches',['enable-automation'])

bro = webdriver.Chrome(executable_path='./chromedriver',chrome_options=chrome_options,options=option)

#无可视化界面(无头浏览器) phantomJs
bro.get('https://www.baidu.com')

print(bro.page_source)
sleep(2)
bro.close()

你可能感兴趣的:(网络爬虫,selenium,chrome,大数据,python)