Python爬虫学习(七)----动态加载数据处理

目录

    • selenium模块的基本使用
      • 简介
      • selenium和爬虫之间的关联
      • selenium使用流程
        • 环境安装
        • 下载浏览器驱动程序(比如谷歌浏览器)
        • 实例化一个浏览器对象
        • 编写基于浏览器自动化的操作代码
        • selenium处理iframe
          • 实例代码
      • 案例实战
      • 无头浏览器 + 反检测
        • 谷歌无头浏览器
        • selenium规避被检测识别
    • 基于selenium实现12306登录
      • 12306模拟登录编码流程

selenium模块的基本使用

简介

selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决 requests 无法直接执行 JavaScript 代码的问题 selenium 本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器。

总结:基于浏览器自动化的一个模块。

selenium和爬虫之间的关联

- 便捷的获取网站动态加载的数据
- 便捷实现模拟登录

selenium使用流程

环境安装

- pip install selenium

下载浏览器驱动程序(比如谷歌浏览器)

下载路径:http://chromedriver.storage.googleapis.com/index.html

实例化一个浏览器对象

Selenium支持非常多的浏览器,如Chrome、Firefox、Edge等,还有Android、BlackBerry等手机端的浏览器。另外,也支持无界面浏览器PhantomJS。

from selenium import webdriver

browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()

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

- 发起请求:
	- get(url)
	
- 获取页面源码数据:page_source
	- browser.page_source

- 标签定位:find一系列方法
	- find_element_by_id()
	- find_element_by_name()
	- find_element_by_class_name()
	- find_element_by_tag_name()
	- find_element_by_link_text()
	- find_element_by_partial_link_text()
	- find_element_by_xpath()
	- find_element_by_css_selector()

- 标签交互:
	- 输入文字时用:send_keys('xxx’)方法,
	- 清空文字时用:clear()方法,
	- 点击按钮时用:click()方法。

- 执行js程序:execute_script(‘jsCode’)
	- browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')

- 前进和后退:back(),forward()

- 关闭浏览器:quit()

selenium处理iframe

- 如果定位的标签存在于iframe标签中,必须使用switch_to.frame('iframeID')方法。
	- browser.switch_to.frame('iframeResult')
	
- 动作链:from selenium.webdriver import ActionChains
	- 实例化一个动作链对象:actions.click_and_hold(source)
	- click_and_hold(source):长按且点击
	- move_by_offset(x,y)
	- perform():让动作链立即执行
	- actions.release():释放动作链
实例代码

实现一个节点的拖曳操作,将某个节点从一处拖曳到另外一处。

from selenium import webdriver
from selenium.webdriver import ActionChains
import time
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)

browser.switch_to.frame('iframeResult')

source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
# 实例化一个动作链对象
actions = ActionChains(browser)
# actions.drag_and_drop(source, target)
# 长按且点击
actions.click_and_hold(source)
time.sleep(3)
for i in range(5):
    actions.move_by_offset(xoffset=17,yoffset=0).perform()
    time.sleep(0.5)
actions.release()

案例实战

需求:模拟登录qq空间

# _author: 17393
# date: 2020/9/24

from selenium import webdriver
from time import sleep

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

bro.switch_to.frame('login_frame')

bro.find_element_by_id('switcher_plogin').click()
tag_Name = bro.find_element_by_id('u')
tag_Pwd = bro.find_element_by_id('p')

tag_Name.send_keys('1739359757')
tag_Pwd.send_keys('xxxxxxx')

btn = bro.find_element_by_id('login_button').click()

sleep(10)

bro.quit()

无头浏览器 + 反检测

谷歌无头浏览器

from selenium import webdriver
# 
from selenium.webdriver.chrome.options import Options

import time

# 创建一个参数对象,用来控制chrome以无界面模式打开
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# 创建浏览器对象
browser = webdriver.Chrome(executable_path='./chromedriver.exe', chrome_options=chrome_options)
# 上网
url = 'http://www.baidu.com/'
browser.get(url)
time.sleep(3)
browser.save_screenshot('baidu.png')
browser.quit()

selenium规避被检测识别

现在不少大网站有对selenium采取了监测机制。比如正常情况下我们用浏览器访问淘宝等网站的 window.navigator.webdriver的值为undefined。而使用selenium访问则该值为true。那么如何解决这个问题呢?

只需要设置Chromedriver的启动参数即可解决问题。在启动Chromedriver之前,为Chrome开启实验性功能参数excludeSwitches,它的值为[‘enable-automation’],完整代码如下:

from selenium.webdriver import Chrome
# 实现规避检测
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)

基于selenium实现12306登录

12306模拟登录编码流程

- 使用selenium打开登录页面
- 对当前selenium打开的页面进行截图
- 对截取的页面进行局部裁剪
	- 好处:将验证码图片和模拟登录一一对应
- 使用超级鹰识别验证码图片((坐标)

你可能感兴趣的:(爬虫学习,selenium)