python爬虫实战之旅( 第八章:selenium模块)

上接: 第七章:异步爬虫(协程法)
下接:12306模拟登录+验证码识别+滑块验证

1.selenium模块

1.1 selenium模块与爬虫之间的关系:

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

1.2 selenium模块定义:

  • 是基于浏览器自动化的一个模块
    selenium使用流程:

1.3 准备工作

环境安装:

pip install selenium

下载一个浏览器的驱动程序:

  • 谷歌浏览器驱动程序下载路径
  • 注意下载版本与自己电脑上浏览器的版本要匹配,将下载好的exe程序文件复制到自己的python编译器的环境文件里。
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    把下载好的驱动程序复制到自己当前的python环境下:
    在这里插入图片描述

在这里插入图片描述

  • 检测一下响应的selenium模块和驱动程序(以“自动打开百度网页搜索梨子”为例)
from selenium import  webdriver
#实例化一个浏览器对象
bro=webdriver.Chrome()
#让浏览器发起一个指定的url对应请求
bro.get('http://baidu.com')
#获取浏览器当前页面的源码数据

成功弹出页面:
在这里插入图片描述

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

2.1 例一:自动爬取药监局首页信息

先去找相应标题所处的标签位置:
在这里插入图片描述

代码:

from selenium import  webdriver
from lxml import etree
from time import sleep
#实例化一个浏览器对象
bro=webdriver.Chrome()
#让浏览器发起一个指定的url对应请求
bro.get('http://scxk.nmpa.gov.cn:81/xk/')
#获取浏览器当前页面的源码数据
page_text=bro.page_source
#解析企业名称
tree = etree.HTML(page_text)
li_list=tree.xpath('//*[@id="gzlist"]/li')
for li in li_list:
    name = li.xpath('./dl/@title')[0]
    print(name)
    pass
#关闭浏览器
sleep(5)
bro.quit()

输出:
在这里插入图片描述

2.2 selenium其他操作

  • 发起请求:get(url)
  • 标签定位:find系列的方法
  • 标签交互:send_keys('xxx')
  • 执行js程序:excute_script('jsCode')
  • 页面的前进后退:back(),forward()
  • 关闭浏览器:quit()

以在淘宝网进行搜索Iphone为例:
①定位搜索框位置
在这里插入图片描述
②模拟点击“搜索”的过程
在这里插入图片描述
③模拟鼠标滑轮滑动的过程(它的本质是一段json代码):
在这里插入图片描述

from selenium import  webdriver
from time import sleep

bro = webdriver.Chrome()
bro.get('https://www.taobao.com/')
#定位到搜索框+标签的交互
search_input=bro.find_element_by_id('q')
#标签的交互
search_input.send_keys('Iphone')
#执行一组js代码
bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
sleep(2)
#点击搜索按钮
btn=bro.find_element_by_css_selector('.btn-search')
btn.click()

bro.get('https://baidu.com')
sleep(2)
#回退页面
bro.back()
#前进页面
bro.forward()
sleep(5)
bro.quit()

3.selenium处理iframe

一张页面往往可以嵌套一张子页面,爬取子页面信息就可以通过iframe。

3.1 拖动标签的处理

实验网址

扫描二维码关注公众号,回复: 12926808 查看本文章

在这里插入图片描述
我们可以看到我们要拖动的小滑块是为位于一个子页面中的
在这里插入图片描述

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

  • 实例化一个动作链对象:action = AcitonChains(bro)
  • click_and_hold(div):长按且点击操作
  • move_by_offset(x,y)控制滑块在左右上下移动的幅度
  • perform()让动作链立即执行
  • action.release()释放动作链对象
from selenium import webdriver
from lxml import etree
from time import sleep
#导入动作链对应的类
from selenium.webdriver import ActionChains

bro = webdriver.Chrome()
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')
#一些列的动作链触发ActionChains
action=ActionChains(bro)
#点击且长按指定的标签
action.click_and_hold(div)
for i in range(5):
    #move_by_offset(x,y)表示水平上下的移动
    #perform()表示立即执行动作链操作
    action.move_by_offset(17,0).perform()
    sleep(1)
    pass
#释放动作链
action.release()
print(div)

3.2 selenium的模拟登录qq空间

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

代码如下:

from selenium import webdriver
from time import sleep

bro = webdriver.Chrome()
bro.get('https://qzone.qq.com/')
bro.switch_to.frame('login_frame')
a_tag=bro.find_element_by_id("switcher_plogin")
a_tag.click()

user_name_tag=bro.find_element_by_id('u')
password_tag=bro.find_element_by_id('p')
sleep(1)
user_name_tag.send_keys('your accout')
sleep(1)
password_tag.send_keys('password')
sleep(1)
btn=bro.find_element_by_id('login_button')
btn.click()

sleep(3)
bro.quit()

4.无头浏览器+规避检测

4.1 无头浏览器(无可可视化界面)

上述一些自动页面往往会弹出来显示,当我们不想看到这些页面只需要它们在后台运行时(这种行为我们称为无头浏览器),就可以用到谷歌无头浏览器相关的知识点:

from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
bro = webdriver.Chrome(options=chrome_options)
# 如果没有把chromedriver加入到PATH中,就需要指明路径 executable_path='/home/chromedriver'

bro.get("https://www.baidu.com")
print(bro.page_source)
sleep(2)
bro.quit()

同样的无头浏览器还有phantomls(但它已经不更新了,主要还是用谷歌无头浏览器)。
当然正是因为提供自动化操作的板块以selenium为主,所以很多门户网站随即选择检测请求是不是selenium发出的(比如用浏览器访问淘宝等网站的参数window.navigator.webdriver的值为undefined;而使用selenium访问则该值为true),如果是就果断屏蔽,从而为了反爬衍生出新的技术:规避检测识别

4.2 selenium规避检测识别

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

from time import sleep
from selenium import webdriver
#实现无可视化界面
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'])
#如何实现让selenium规避被检测的风险
bro = webdriver.Chrome(options=option)

#无可视化界面(无头浏览器)
bro.get("https://www.baidu.com")
print(bro.page_source)
sleep(2)
bro.quit()

猜你喜欢

转载自blog.csdn.net/KQwangxi/article/details/114448925
今日推荐