Python网络爬虫实践简答题
文章目录
- 简答题
- 总结selenium的特点
- selenium常用API
- 元素定位
- id定位
- name定位
- class_name定位
- tag_name定位
- link_text定位
- partial_link_text定位
- XPath定位
- CSS定位
- 元素操作、浏览器操作方法
- 鼠标和键盘操作
- 元素等待
- 显式等待
- 验证码处理
- python操作mysql数据库
- 创建连接
- 关于游标,执行SQL,查询数据
- 插入一条数据
- 添加多条数据
- 修改、更新数据
- 删除数据
简答题
总结selenium的特点
- 开源、免费
- 跨平台:Linux,windows,MAC, Solaris
- 支持多浏览器:chrome, IE, firefox, Edge, Oprea
- 支持多语言:C#, Java, Perl, PHP, Python, Ruby
selenium常用API
元素定位
定位方法:
# selenium 4.x 版本使用:
from selenium.webdriver.common.by import Bydriver.find_element(By.xxx, xxx)
id定位
通过id属性来定位元素
HTML规定id属性在整个HTML文档中必须是唯一的
from selenium.webdriver.common.by import Bydriver.find_element(By.ID, id)
name定位
以name属性定位
HTML文档中name属性值可以重复
from selenium.webdriver.common.by import Bydriver.find_element(By.NAME, name)
class_name定位
根据元素class属性定位
HTML通过使用class来定义元素的样式
from selenium.webdriver.common.by import Bydriver.find_element(By.CLASS_NAME, class_name)
tag_name定位
通过标签名定位
HTML本质是由不同tag组成,每一个tag会在页面中存在多个,所以不方便进行精确定位,一般很少使用
from selenium.webdriver.common.by import Bydriver.find_element(By.TAG_NAME, tag_name)
link_text定位
专门用来定位超链接元素<a>标签</a>
,并且是通过超链接的文本内容来定位元素
link_text为超链接的全部文本内容
from selenium.webdriver.common.by import Bydriver.find_element(By.LINK_TEXT, link_text)
partial_link_text定位
对link_text的补充,可以使用局部文本匹配元素
from selenium.webdriver.common.by import Bydriver.find_element(By.PARTIAL_LINK_TEXT, partial_link_text)
XPath定位
- 路径-定位
- 绝对路径: /html根结点开始,使用/分隔元素层级(不建议使用)
- 相对路径: 以 // 开始,//input 或 //*
- 元素属性-定位
//input[@id='属性值']
或者//*[@id='属性值']
- 属性与逻辑结合-定位(多个属性)
//*[@name='属性值' and @class='属性值']
- 层级与属性结合-定位(找父属性)
//*[@id='p1']/input
from selenium.webdriver.common.by import Bydriver.find_element(By.XPATH, xpath)
Xpath-延伸
//*[text()="xxx"] # 文本内容是xxx的元素//*[contains(@attribute, 'xxx')] # 属性中含有xxx的元素//*[starts-with(@attribute, 'xxx')] # 属性以xxx开头的元素
CSS定位
- id选择器
- #id
- class选择器
- .class
- 元素选择器
- 根据元素的标签名选择
- element
- 属性选择器
- 根据元素的属性名和值选择
- [attribute=value] 或者 element[attribute=value]
- 层级选择器
- 根据元素的父子关系选择
- element1>element2,element2必须为element1的直接子元素
- element1 element2,element2为element1的后代元素
from selenium.webdriver.common.by import Bydriver.find_element(By.CSS_SELECTOR, css_selector)
CSS延伸
input[type^='p'] # type属性以p字母开头的元素input[type$='d'] # type属性以d字母结束的元素input[type*='w'] # type属性包含w字母的元素
元素操作、浏览器操作方法
- 元素常用的操作方法
- 使用方法:定位元素.方法
- 例:
driver.find_element(By.ID, 'su').click()
click() # 单击元素send_keys(value) # 模拟输入clear() # 清除文本
- 操作浏览器的常用方法
- 使用方法:driver.方法(前提:
driver = webdriver.Chrome()
) - 例:
driver.maximize_window() # 窗口最大化
- 使用方法:driver.方法(前提:
maximize_window() # 最大化浏览器窗口 --> 模拟浏览器最大化按钮
set_window_size(width, height) # 设置浏览器窗口大小 --> 设置浏览器宽、高(像素点)
set_window_position(x, y) # 设置浏览器窗口位置 --> 设置浏览器位置
back() # 后退 --> 模拟浏览器后退按钮
forward() # 前进 --> 模拟浏览器前进按钮
refresh() # 刷新 --> 模拟浏览器F5刷新
close() # 关闭当前窗口 --> 模拟点击浏览器关闭按钮
quit() # 关闭浏览器驱动对象 --> 关闭所有程序启动的窗口
title # 获取页面title
current_url # 获取当前页面URL
close()和quit()区别:
- close():关闭当前主窗口
- quit():关闭由driver对象启动的所有窗口
当前只有一个窗口二者没有区别
- 获取元素信息的常用方法
- 使用方法:定位元素.方法
- 例:
driver.find_element(By.ID, 'su').get_attribute("id")
size # 返回元素大小
text # 获取元素的文本
get_attribute("xxx") # 获取属性值,传递的参数为元素的属性名
is_displayed() # 判断元素是否可见
is_enabled() # 判断元素是否可用
is_selected() # 判断元素是否选中,用来检查复选框或单选按钮是否被选中
- text和size调用时没有括号
- get_attribute使用场景:判断一组元素是否为想要的元素或者判断元素属性值是否正确
鼠标和键盘操作
- 鼠标操作的方法
- 说明:在Selenium中将操作鼠标的方法封装在ActionChains类中
导包:from selenium.webdriver import ActionChains实例化对象:action = ActionChains(driver)
方法
context_click(element).perform() # 右击
double_click(element).perform() # 双击
drag_and_drop(source, target).perform() # 拖动
move_to_element(element).perform() # 悬停
- 键盘操作的方法
- 使用方法:定位元素.send_keys(方法)
- 例:
driver.find_element(By.ID, 'su').send_keys(Keys.BACKSPACE)
导包:from selenium.webdriver import Keys
方法
send_keys(Keys.BACK_SPACE) # 删除键(BackSpace)
send_keys(Keys.SPACE) # 空格键(Space)
send_keys(Keys.TAB) # 制表键(Tab)
send_keys(Keys.ESCAPE) # 回退键(Esc)
send_keys(Keys.ENTER) # 回车键(Enter)
send_keys(Keys.CONTROL,'a') # 全选(Ctrl+A)
send_keys(Keys.CONTROL,'c') # 复制(Ctrl+C)
元素等待
- 隐式等待
- 显式等待
显式等待
针对单个元素生效
定位指定元素时,如果能定位到元素则直接返回该元素,不触发等待;如果不能定位到该元素,则间隔一段时间后再去定位元素;如果达到最大时长还没有找到指定元素,则抛出超时异常TimeoutException
导包 等待类
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait()
WebDriverWait(driver, timeout, poll_frequency=0.5)- driver:浏览器驱动对象- timeout:超时的时长,单位:秒- poll_frequecy:检测间隔时间,默认为0.5秒
调用方法:until(method):直到。。。时
- method:函数名称,该函数用来实现对元素的定位
- 一般使用匿名函数来实现:- lambda x: x.find_element_by_id("userA")
应用
element = webDriverWait(driver, 10, 1).until(lambda x: x.find_element_by_id("userA"))
验证码处理
cookie跳过登录方法
- 使用方法:driver.方法
- get_cookie(name)- name:为cookie的名称
- get_cookies() # 获取本网站所有本地cookie
- add_cookie(cookie_dict) # 添加cookie- cookie_dict:一个字典对象,必选的键包括:"name" and "value"
添加cookie后必须使用driver.refresh()刷新方法,否则看不到登录效果
python操作mysql数据库
python操作数据库的过程:
创建连接-获取游标-执行命令-关闭游标-关闭连接
创建连接
python访问 mysql需要用pymysql库
import pymysqldef mysql_db():conn = pymysql.connect(host="127.0.0.1",port=3306,database="spider",charset="utf8",user="root",passwd="root")
关于游标,执行SQL,查询数据
游标需要创建游标还要关闭游标,为防止忘关游标,所以用with
# 打开数据库可能有风险,所以添加异常捕捉
try:with conn.cursor() as cursor:# 准备sql语句sql = "select * from user"cursor.execute(sql)## 执行完SQL语句后的返回结果都是保存到cursor中,所以要从cursor中获取全部数据datas = cursor.fetchall()print("获取的数据:\n", datas)
except Exception as e:print("数据库操作异常:\n", e)
finally:# 不管成功还是失败,都要关闭数据库连接conn.close()
curcor中获取数据的fetchall, fetchone, fetchmany
- fetchall: 获取当前SQL语句能查出来的全部数据
- fetchone: 每次获取一条数据,但是获取到这条数据之后指针会往后移一行数据
- fetchmany: 直接告诉他想要多少条数据
cursor.fetchmany(3) # 获取三条数据
插入一条数据
重点一个是commit,一个是rollback。有提交的地方一定要有回滚,回滚到上次提交的地方
try:with conn.cursor() as cursor:# 准备sql语句value = "12, 'zj'"sql = f"insert into user values ({value});"# 执行SQL语句cursor.execute(sql)# 执行完SQL语句之后要提交conn.commit()print("提交成功")
except Exeption as e:# 如果执行失败要回滚conn.rollback()print("数据库操作异常:\n", e)
finally:# 不管成功还是失败,都要关闭数据库连接conn.close()
添加多条数据
try:with conn.cursor() as cursor:# 准备要插入的数据value = "(13,'张三'),(14,'李四'),(15,'王五')"# 准备SQL语句sql = f"insert into user values {value};"# 执行SQL语句cursor.execute(sql)# 执行完要提交conn.commit()print("提交成功")except Exception as e:# 如果执行失败要回滚conn.rollback()print("数据库操作异常:\n", e)finally:# 不管成功还是失败,都要关闭数据库连接conn.close()
修改、更新数据
只需要修改添加的SQL语句,其他不变
增删改查,除了查询,其他都要提交
try:with conn.cursor() as cursor:# 准备sql语句sql = f"update user set name='封校'"# 执行SQL语句cursor.execute(sql)# 执行完提交conn.commit()
except Exception as e:# 执行失败回滚conn.rollback()print("数据库操作异常:\n", e)
finally:# 无论是否执行成功都要关闭数据库连接conn.close()
删除数据
try:with conn.cursor() as cursor:sql = "delete from user where id=12;"cursor.execute(sql)conn.commit()
except Exception as e:conn.rollback()print("数据库操作异常:\n", e)
finally:conn.close()
Python网络爬虫实践简答题相关推荐
- Python网络爬虫实践(1):爬取网易云音乐播放量大于1000万的歌单
Python网络爬虫实践(1) 一.需求分析 爬取网易云音乐播放量大于1000万的歌单. 二.实施步骤 1.安装selenium selenium是一个用于Web应用自动化程序测试的工具,测试直接运行 ...
- Python网络爬虫实践(2):爬取小说网站小说
Python网络爬虫实践(2) 一.需求分析 爬取某小说网站的一部小说 二.步骤 目标数据 网站 页面 分析数据加载流程 分析目标数据所对应的url 下载数据 清洗,处理数据 数据持久化 重点:分析目 ...
- python编程入门到实践 百度云-python网络爬虫从入门到实践pdf
python网络爬虫从入门到实践pdf是一本非常热门的编程教学.这本书籍详细讲解了Python以及网络爬虫相关知识,非常适合新手阅读,需要的用户自行下载吧. Python网络爬虫从入门到实践电子书介绍 ...
- python网络爬虫教程-终于明了python网络爬虫从入门到实践
Python是一款功能强大的脚本语言,具有丰富和强大的库,重要的是,它还具有很强的可读性,易用易学,非常适合编程初学者入门.以下是小编为你整理的python网络爬虫从入门到实践 环境配置:下载Pyth ...
- 【读书笔记】Python网络爬虫从入门到实践(第2版)-唐松,爬虫基础体系巩固和常见场景练习
[概述] 书名:Python网络爬虫从入门到实践(第2版) 作者:唐松 日期:2021年08月01日 读书用时:1568页,100小时,59个笔记 [读书笔记] ◆ 1.2 网络爬虫是否合法 爬虫协议 ...
- python网络爬虫从入门到实践 第5章 (二)
python网络爬虫从入门到实践 第5章 (二) https://beijing.anjuke.com/sale/ \xa0 是不间断空白符 我们通常所用的空格是 \x20 ,是在标准ASCII可 ...
- 《Python网络爬虫从入门到实践 第2版》第14章 爬虫实践一:维基百科
第14章 爬虫实践一:维基百科 "是骡子是马,拉出来遛遛".我们已经将Python网络爬虫的技术系统地学习完了,后面几个章节开始进入实践环节.每一章都会使用之前学习的技术,通过实践 ...
- python网络爬虫学习笔记(7)动态网页抓取(二)实践
文章目录 1 资料 2 笔记 2-1 准备 2-1-1. 网址 2-2-2 文本位置 2-2 代码 2-2-1 原型 2-2-2 ver0.1 1 资料 <Python网络爬虫从入门到实践> ...
- 玩转python网络爬虫黄永祥pdf下载_Python网络爬虫从入门到实践pdf
Python网络爬虫从入门到实践 内容简介 本书将介绍如何使用Python编写网络爬虫程序获取互联网上的大数据.本书包括三部分内容:基础部分.进阶部分和项目实践.基础部分(第1~6章)主要介绍爬虫的三 ...
最新文章
- 计算某个时间距离现在_计算成像amp;深度学习(1)
- win10 安装字体且不占用系统盘资源
- 2019年需要探究的十大战略性技术趋势
- springboot 获取application参数_(最新 9000 字 )Spring Boot 配置特性解析
- QT绘制散点图(1)
- linux cpu核数和线程数,cpu个数、核数和线程的理解
- OpenCV2:等间隔采样和局部均值的图像缩小
- 【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
- 查看Json的结构及内容:JsonViewerPackage
- 手机端仿ios的银行下拉脚本五
- R实现地理位置与经纬度相互转换
- mui多层tab切换上拉加载的实现
- 荣耀V8鸿蒙系统刷机包,华为荣耀V8原版rom系统刷机包_荣耀V8最新版升级包更新下载...
- MS11-003在Internet Explorer中存在允许远程代码执行漏洞复现
- win10系统的qq无网络连接网络连接到服务器,Win10能上qq打不开网页_Win10能上qq不能上网怎么办?-192路由网...
- RoboMaster视觉笔记CMake(六) Compile Flags
- Windows主机操作系统安全加固规范
- 如何通过TXT文件批量生成汉信码
- day fit into much one too_2018年广东省高考英语听说考试真题A-E(附答案)
- 幂果支招:哪里找免费的Mac版音频剪辑软件
热门文章
- IPP与Opencv配合使用
- Jquery实现淘宝服饰精品案例
- Linux刻录光盘win10认不到,Win10不能读取DVD光驱和刻录光盘解决方法
- 在没有源码的情况下修改.class文件
- Elasticsearch 5.0 rollover api 学习
- Spring Data Elasticsearch 和 x-pack 用户名/密码验证连接
- 使用IPMI安装操作系统--超微服务器为例,以及ipmivier安装与使用
- 3分钟搞明白信用评分卡模型模型验证
- JavaScript高级(二)|函数进阶+正则表达式
- 【论文阅读】7-Discovering Structural Regularity in 3D Geometry