【基础】【Python网络爬虫】【8.Selenium入门】selenium配置、环境安装、浏览器驱动下载(附大量案例代码)(建议收藏)

Python网络爬虫基础

  • Selenium 入门
    • 1. 动态网页&静态网页
      • 动态网页
        • JavaScript
        • JQuery
        • Ajax
        • HTML
      • 动态网页处理方法
    • 2. Selenium 工作原理
    • 3. Selenium 配置
      • 环境安装
      • 浏览器驱动下载
        • 配置浏览器驱动
      • selenium 快速上手
    • 4. Driver对象的常用方法及属性
    • 5. 元素提取
    • 6. 元素对象的方法及属性
    • 7. 页面的等待渲染
    • 8. 页面的前进和后退
    • 9. 切换页面的窗口
        • 案例 - 模拟登录码云
        • 案例 - 酷六网
        • 案例 - 登录Github

Selenium 入门

  • 是一种浏览器自动化的工具,所谓的自动化是指,我们可以通过代码的形式制定一系列的行为动作,然后执行代码,这些动作就会同步触发在浏览器中。
  • Selenium 测试工具直接操控浏览器中,就像真正的用户在操作一样。Selenium 可以根据的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生等。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Chrome,Safari,Google Chrome,Opera等。

1. 动态网页&静态网页

静态网页是指存放在服务器文件系统中实实在在的HTML文件。当用户在浏览器中输入页面的URL,然后回车,浏览器就会将对应的HTML文件下载、渲染并呈现在窗口中。早期的网站通常都是由静态页面制作的。

动态网页

  • 动态网页是相对于静态网页而言的。当浏览器请求服务器的某个页面时,服务器根据当前时间、环境参数、数据库操作等动态的生成HTML页面,然后在发送给浏览器(后面的处理就跟静态网页一样了)。
  • 很明显,动态网页中的“动态”是指服务器端页面的动态生成,相反,“静态”则指页面是实实在在的、独立的文件。

**注意:**

  • 动态页面技术是与 静态页面 技术相对应的,也就是说,网页URL的后缀不是 .htm、.html、.shtml、.xml 等静态网页的常见形式,而是以 .asp、.jsp、.php、.perl、.cgi 等形式为后缀,并且在 动态网页 网址中有一个标志性的符号——“?”。
  • 这里说的 动态网页 ,与网页上的各种动画、滚动字幕等视觉上的“动态效果”没有直接关系,动态网页也可以是纯文字内容的,也可以是包含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具有动态效果,采用动态网站技术生成的网页都称为动态网页。
JavaScript

JavaScript是一种属于网络的脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。
可以在网页源代码的标签里看到,比如:

<script type="text/javascript" src="https://statics.huxiu.com/w/mini/static_2015/js/sea.js?v=201601150944"></script>

JavaScript可以动态地创建HTML内容,这些内容只有在JavaScript代码执行之后才会产生和显示如果使用传统的方法采集页面内容,就只能获得JavaScript代码执行之前页面上的内容。

JQuery

JQuery是一个快速、简洁的JavaScript框架,它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。一个网站使用 JQuery 的特征, 就是源代码里包含了 JQuery 入口,比如:

<script type="text/javascript" src="https://statics.huxiu.com/w/mini/static_2015/js/jquery-1.11.1.min.js?v=201512181512"></script>

如果一个网站网页源码中出现了 jQuery,那么采集这个网站数据的时候要格外小心。因为jQuery可以动态地创建HTML内容,这些内容只有在JavaScript代码执行之后才会产生和显示。如果使用传统的方法采集页面内容,就只能获得JavaScript代码执行之前页面上的内容。

Ajax
  • 使用Ajax技术更新网页的内容的网站有个很大的特点,那就是可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
  • Ajax其实并不是一门语言,而是用来完成网络任务(可以认为它与网络数据采集差不多)的一系列技术。Ajax网站不需要使用整个的页面加载就可以和网络服务器进行交互。
HTML
  • DHTML: Dynamic HTML 动态的HTML, 这门技术并不是一门新的技术, 而是将之前所学的HTML、CSS、JavaScript整合在一起,利用JS操作页面元素, 让元素具有动态的变化, 使得页面和用户具有交互的行为。

动态网页处理方法

使用动态加载的网站,用 Python 解决有如下几种途径:

  1. 直接破解 JavaScript 代码里采集内容。
  2. 抓包分析,查看截图的请求响应信息,伪造请求,实现响应的获取。(推荐)
  3. 用 Python 的 第三方库运行 JavaScript,直接采集你在浏览器里看到的页面。(推荐)

既然浏览器能拿到数据,那么,可以模拟一个浏览器,从浏览器中拿到数据。也就是用程序控制浏览器,从而达到数据采集的目的。

2. Selenium 工作原理

在这里插入图片描述
如图所示,通过 Python 来控制 Selenium,然后让 Selenium 控制浏览器,操纵浏览器,这样就实现了使用Python 间接的操控浏览器。

3. Selenium 配置

Selenium 支持多种浏览器,最常见的就是 火狐谷歌 浏览器。首先在电脑上下载浏览器,浏览器版本不宜过新。

环境安装

安装 selenium 模块,python借助这个模块驱动浏览器,使用如下命令行安装这个模块即可

# 下载安装 selenium
pip install selenium

浏览器驱动下载

Selenium具体怎么就能操纵浏览器呢?这要归功于 浏览器驱动 ,Selenium可以通过API接口实现和浏览器驱动的交互,进而实现和浏览器的交互。所以要配置浏览器驱动。

  • 火狐驱动下载地址: http://npm.taobao.org/mirrors/geckodriver/

  • 谷歌驱动下载地址:https://npm.taobao.org/mirrors/chromedriver/

  • 新版本的驱动下载地址:https://googlechromelabs.github.io/chrome-for-testing/#stable

配置浏览器驱动

将下载好的浏览器驱动解压,将解压出的 exe 文件放到Python的安装目录下,也就是和python.exe同目录即可。
在这里插入图片描述

selenium 快速上手

"""
驱动配置方式:1. 查找到浏览器对应的驱动下载: https://npm.taobao.org/mirrors/chromedriver/2. 使用:方式1: 驱动放到项目目录中<建议>方式2: 放python解释器目录, 全局配置
"""
# pip install selenium --user 安装指令from selenium import webdriver  # 浏览器功能, 导入部分功能# 1. 创建一个浏览器对象(打开一个浏览器)
driver = webdriver.Chrome()# 2. 使用浏览器对象请求网址
driver.get('https://www.baidu.com')# 3. 自动操作页面# 4. 退出浏览器
input('阻塞浏览器的退出')
driver.quit()  # 退出浏览器"""
一旦咱们通过浏览器请求到页面以后
咱们后续的一系列操作, 和找你们平常操作页面的顺序大致是一样的
咱们的代码逻辑和浏览器的操作顺序大致一致
"""

4. Driver对象的常用方法及属性

import time
from selenium import webdriver  # 浏览器功能, 导入部分功能driver = webdriver.Chrome()# get()  通过driver对象请求指定的网页
driver.get('https://www.baidu.com')# save_screenshot('百度.png')  截取页面的图片, 括号内部指定路片保存路径
driver.save_screenshot('百度.png')# page_source 查看浏览器渲染以后的数据,
# 此方式得到的数据和真实浏览器得到的数据可能会有出入
# 在真实浏览器中看到的数据和用selenium工具得到的数据页可能会有出入
# 一切数据以代码获取的数据为准
print(driver.page_source)# with open('a.html', mode='w', encoding='utf-8') as f:
#     f.write(driver.page_source)# get_cookies()  查看页面请求以后的cookies
print(driver.get_cookies())# 查看当前页面的url地址
print(driver.current_url)# 最大化浏览器
driver.maximize_window()time.sleep(3)# 最小化浏览器
driver.minimize_window()input('阻塞浏览器的退出')
driver.quit()  # 退出浏览器# 默认情况下代码操作的浏览器是一个全新无缓存数据的浏览器

5. 元素提取

from selenium import webdriver
from selenium.webdriver.common.by import By  # 定位器功能driver = webdriver.Chrome()
driver.get('https://www.douban.com/')"""解析数据"""
# 根据标签的id属性值定位标签元素, 提取出来都是标签对象 --> <selenium.webdriver.remote.webelement.WebElement (
result = driver.find_element(By.ID, 'anony-reg-new')
print(result)# 根据标签的name属性值做定位
result2 = driver.find_element(By.NAME, 'description')
print(result2)# 根据标签class属性值做定位
result3 = driver.find_element(By.CLASS_NAME, 'wrapper')
print(result3)# 根据标签包含的文本提取标签对象<精确匹配>
result4 = driver.find_element(By.LINK_TEXT, '下载豆瓣 App')
print(result4)# 根据标签包含的文本提取标签对象<模糊匹配>
result5 = driver.find_elements(By.PARTIAL_LINK_TEXT, '豆瓣')
print(result5)
print(len(result5))# 根据标签名字定位标签
result6 = driver.find_elements(By.TAG_NAME, 'div')
print(result6)
print(len(result6))"""css选择器和xpath在selenium中也能使用一次提取和二次提取, 规则一样"""
# 根据css语法做定位, 只能定位, 不能用属性提取
result6 = driver.find_element(By.CSS_SELECTOR, '.app>a')
print(result6)# 根据css语法做定位, 只能定位, 不能用属性提取
result7 = driver.find_element(By.XPATH, '//div[@class="app"]/a')
print(result7)input()
driver.quit()"""
find_element 提取符合条件的第一个标签
find_elements 提取符合条件的所有标签
"""

6. 元素对象的方法及属性

from selenium import webdriver
from selenium.webdriver.common.by import By  # 定位器功能driver = webdriver.Chrome()
driver.get('https://www.douban.com/')"""
text 属性可以提取到标签对象包含的文本内容, 支持链式调用使用css选择器或者xpath只能定位标签, 不能写提取标签属性的解析语法, 在selenium中不支持
"""
# result6 = driver.find_element(By.CSS_SELECTOR, '.app>a')
# contend = result6.text
# print(contend)
# css选择器和xpath在selenium中也能使用一次提取和二次提取, 语法规则一样
result6 = driver.find_element(By.CSS_SELECTOR, '.app>a').text
print(result6)result6 = driver.find_element(By.CSS_SELECTOR, '.app>a')
contend = result6.get_attribute('href')
print(contend)"""
如果标签对象是输入框
send_keys('指定输入的字符串')
支持链式调用
"""
input_label = driver.find_element(By.CSS_SELECTOR, '.inp>input')
input_label.send_keys('消失的她')"""
.click() 点击标签对象, 支持链式调用
"""
search_label = driver.find_element(By.CSS_SELECTOR, '.bn')
search_label.click()input()
driver.quit()

7. 页面的等待渲染

import timefrom selenium import webdriverdriver = webdriver.Chrome()
driver.get('https://github.com/')# 隐式等待: 括号内部设置隐式等待时间, 单位秒;
# 是一个智能化等待, 一旦页面在设置的时间之前加载完了, 那么不会死等下去
# 超过了隐式等待时间, 报错
# 在一个项目中, 隐式等待只需要设置一次, 后续的页面都沿用这个隐式等待规则
driver.implicitly_wait(10)# 强制等待, 死等, ajax页面渲染需要死等
time.sleep(3)input()
driver.quit()

8. 页面的前进和后退

import timefrom selenium import webdriverdriver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
time.sleep(3)driver.get('https://news.baidu.com/')
time.sleep(3)driver.back()  # 后退到上一级页面
time.sleep(3)driver.forward()  # 前进到上一个页面
time.sleep(3)# 页面的前进和后退, 会导致页面元素过期
# 需要刷新重新获取页面元素
driver.refresh()input()
driver.quit()

9. 切换页面的窗口

import timefrom selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get('https://www.douban.com/')time.sleep(2)
# 点击 "读书"
driver.find_element(By.CSS_SELECTOR, '.lnk-book').click()# driver.window_handles 获取当前浏览器窗口句柄
# 如果打开多个页面, 默认情况窗口句柄为第一个窗口
print(driver.window_handles)time.sleep(3)
driver.switch_to.window(driver.window_handles[0])  # 切换窗口句柄# 关闭当前页面
# driver.close()input()
driver.quit()
案例 - 模拟登录码云
import timefrom selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get('https://gitee.com/')
driver.implicitly_wait(10)
driver.maximize_window()# 点击右上角登录
driver.find_element(By.LINK_TEXT, '登录').click()"""填写用户名密码"""
driver.find_element(By.CSS_SELECTOR, '#git-login>input').send_keys('用户名')
time.sleep(2)driver.find_element(By.CSS_SELECTOR, '#user_password').send_keys('密码')
time.sleep(2)# 点击登录按钮
driver.find_element(By.NAME, 'commit').click()# cookies可以用在requests请求里面
print(driver.get_cookies())  # 登录以后可以获取到登录后的cookiesinput()
driver.quit()
案例 - 酷六网
"""
目标网址: https://www.ku6.com/detail/71作业要求:1.用 selenium 采集所需要的数据2.需要数据如下所示title 视频的标题img_url 视频图片对应的url地址detail_url 视频详情页url地址3.保存为csv数据
请在下方编写代码
"""# 浏览器安装路径-->默认装C盘-->自动识别安装路径from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.get('https://www.ku6.com/detail/71')  # GET  POST
print(driver.page_source)divs = driver.find_elements(By.XPATH, '//*[@class="video-item"]')
print(len(divs))
for div in divs:title = div.find_element(By.XPATH, './/h3/a').textimg_url = div.find_element(By.XPATH, './/a[@class="video-image-warp"]/img').get_attribute('src')derail_url = div.find_element(By.XPATH, './/a[@class="video-image-warp"]').get_attribute('href')print(title, img_url, derail_url, sep='|')input()
driver.quit()
案例 - 登录Github
"""
目标网址: https://github.com/login 模拟登录作业要求:1.用 selenium 模拟登录GitHub(首先自己注册一个账号)
温馨提示:这个网站加载速度很慢, 最好设置时间长一点的等待
请在下方编写代码
"""
import timefrom selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""
})
driver.get('https://github.com/login')
driver.implicitly_wait(10)with open('a.html', mode='w', encoding='utf-8') as f:f.write(driver.page_source)driver.find_element(By.CSS_SELECTOR, '#login_field').send_keys('hjx_edu')
time.sleep(2)driver.find_element(By.NAME, 'password').send_keys('qingdeng123')
time.sleep(2)# 点击登录
driver.find_element(By.NAME, 'commit').click()input()
driver.quit()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/311007.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【基础】【Python网络爬虫】【5.数据解析】bs4、Xpath、Parsel模块、正则表达式(附大量案例代码)(建议收藏)

Python网络爬虫基础 数据解析1. 为何数据解析2. 常见的数据类型结构化数据半结构化数据非结构化数据 3. 爬虫项目实现步骤 数据解析模块1. Bs4环境安装bs4解析流程案例 - bs4碧血剑文本爬取 2. Xpath环境安装xpath解析的编码流程xpath表达式如何理解&#xff1f;案例 - 简历模板…

《深入理解C++11:C++11新特性解析与应用》笔记六

第六章 提高性能及操作硬件的能力 6.1 常量表达式 6.1.1 运行时常量性与编译时常量性 大多数情况下&#xff0c;const描述的是运行时常量性&#xff0c;也即是运行时数据的不可更改性。但有时候我们需要的却是编译时的常量性&#xff0c;这是const关键字无法保证的。例如&am…

SparkStreaming与Kafka整合

1.3 SparkStreaming与Kafka整合 1.3.1 整合简述 kafka是做消息的缓存&#xff0c;数据和业务隔离操作的消息队列&#xff0c;而sparkstreaming是一款准实时流式计算框架&#xff0c;所以二者的整合&#xff0c;是大势所趋。 ​ 二者的整合&#xff0c;有主要的两大版本。 kaf…

Java流程控制语句(if语句,switch语句,for循环,while循环,do...while循环,三种循环的区别)

文章目录 第一章 流程控制语句1.1 流程控制语句分类1.2 顺序结构 第二章 判断语句&#xff1a;if语句2.1 if语句格式1练习1&#xff1a;老丈人选女婿练习2&#xff1a;考试奖励第一种格式的细节&#xff1a; 2.2 if语句格式2练习1&#xff1a;吃饭练习2&#xff1a;影院选座 2.…

MATLAB中./和/,.*和*,.^和^的区别

MATLAB中./和/&#xff0c;.*和*&#xff0c;.^ 和^ 的区别 MATLAB中./和/&#xff0c;.*和*&#xff0c;.^ 和^ 的区别./ 和 / 的区别.//实验实验结果 .* 和 * 的区别.**实验实验结果 .^ 和^ 的区别.^n^n实验运行结果 MATLAB中./和/&#xff0c;.和&#xff0c;.^ 和^ 的区别 …

文件描述符

文件描述符 2.1 文件描述符 文件描述符&#xff08;File Descriptor&#xff09;是在Unix-like操作系统中用于标识和访问文件或I/O设备的抽象概念。它是一个非负整数&#xff0c;用于**唯一标识一个打开的文件、套接字&#xff08;socket&#xff09;或其他类型的I/O资源。**…

一个项目,用十款数据库?

大家好&#xff0c;我是豆小匠。 关于数据库&#xff0c;大学的时候只知道MySQL&#xff0c;学习深入点也就是用到了Redis、MongoDB等非关系型数据库。 然而&#xff0c;工作中用到的数据库实在太多&#xff0c;每种数据库都有自身的优势和局限性。所以在这里梳理下日常常用数…

运动轨迹仿真

重型运载火箭轨迹/总体参数一体化优化方法 硬核推导火箭运动方程&#xff0c;并用python仿真实现 rocket-simulation:MATLAB-火箭仿真软件 MatRockSim:Matlab 火箭飞行模拟器 【开源】飞鹰一号探空火箭——箭体设计、制造回顾与仿真对比 偏航角&#xff0c;滚动角&#xf…

迅为RK3588开发板RTMP推流之视频监控之搭建 RTMP 媒流体服务器

1.安装 nginxrtmp 运行所要用到的库和依赖环境 apt-get update apt-get install build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev openssl 2. 下 载 nginx-1.20.2 源 码 ( 下 载 地 址 &#xff1a; http://nginx.org/download/nginx-1.20.2.tar.gz) 和nginx-…

搭建FTP服务器与计算机端口介绍

FTP介绍 FTP&#xff08;File Transfer Protocol&#xff09;是一种用于在计算机网络上进行文件传输的协议。它允许用户通过客户端与服务器进行通信&#xff0c;从服务器下载文件或将文件上传到服务器。 FTP使用客户端-服务器模型。用户使用FTP客户端软件连接到FTP服务器&…

解决IDEA 不能正确识别系统环境变量的问题

问题描述 本人laptop 上的是设置了GOOGLE_APPLICATION_CREDENTIALS 这个环境变量的&#xff0c; 正常java or python 的程序能基于这个环境变量使用 某个gcp service account 去访问GCP的资源 [gatemanmanjaro-x13 ~]$ env | grep -i google GOOGLE_APPLICATION_CREDENTIALS/…

基于Python的B站排行榜大数据分析与可视化系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文介绍了一项基于Python的B站排行榜大数据分析与可视化系统的研究。通过网络爬虫技术&#xff0c;系统能够自动分析B站网址&#xff0c;提取大量相关文本信息并存储在系统中。通过对这些信息进行…