Day:006(1) | Python爬虫:高效数据抓取的编程技术(爬虫工具)

news/2024/5/11 10:48:13/文章来源:https://blog.csdn.net/m0_49547615/article/details/137613913

selenium介绍与安装

        Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。

        Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。

        Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行,所以我们可以用一个叫 PhantomJS 的工具代替真实的浏览器。

PyPI网站下载 Selenium库https://pypi.org/simple/selenium/,也可以用 第三方管理器

Selenium 官方参考文档:https://selenium-python.readthedocs.io/index.html 

安装

pip install selenium

安装Firefox geckodriver 

安装firefox最新版本,添加Firefox可执行程序到系统环境变量。记得关闭firefox的自动更新

firefox下载地下:https://github.com/mozilla/geckodriver/releases

将下载的geckodriver.exe 放到path路径下 D:\Python\python_version\

安装ChromeDriver

http://chromedriver.storage.googleapis.com/index.html

注意
版本号要对应

下载下来的文件解压到 python_version\Scripts 

测试代码

# 导入 webdriver
from selenium import webdriver
# 要想调用键盘按键操作需要引入keys包
from selenium.webdriver.common.keys import Keys
# 调用环境变量指定的PhantomJS浏览器创建浏览器对象
driver = webdriver.Chrome()
# 如果没有在环境变量指定PhantomJS位置
# driver =webdriver.Chrome(executable_path="./phantomjs"))
# get方法会一直等到页面被完全加载,然后才会继续程序,通常测试会在这里选择 time.sleep(2)
driver.get("http://www.baidu.com/")
# 打印网页渲染后的源代码
print(driver.page_source)
# 生成新的页面快照
driver.save_screenshot("python爬虫.png")
# 获取当前url
print(driver.current_url)
# 关闭浏览器
driver.quit()

selenium 控制浏览器

最大化窗口

我们知道调用启动的浏览器不是全屏的,这样不会影响脚本的执行,但是有时候会影响我们“观看”脚本的执行。

browser = webdriver.Chrome()url= 'http://www.baidu.com'
browser.get(url)borwser.maximize_window()
 设置宽与高

最大化还是不够灵活,能不能随意的设置浏览的宽、高显示?当然是可以的。

browser = webdriver.Chrome()url= 'http://www.baidu.com'
browser.get(url)borwser.set_window_size(500,600)
 浏览器前进、后退

浏览器上有一个后退、前进按钮,对于浏览网页的人是比较方便的;对于做web自动化测试的同学来说应该算是一个比较难模拟的问题
其实很简单,下面看看python的实现方式

browser = webdriver.Chrome()#访问百度首页
first_url= 'http://www.baidu.com
browser.get(first_url)
time.sleep(2)#访问新闻页面
second_url='http://news.baidu.com
browser.get(second_url)
time.sleep(2)#返回(后退)到百度首页print "backto %s "%(first_url)
browser.back()
time.sleep(1)#前进到新闻页print "forward to %s"%(second_url)
browser.forward()
time.sleep(2)
browser.quit()

selenium元素定位

对象的定位应该是自动化的核心,要想操作一个对象,首先应该识别这个对象。

一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身份证号,姓名,或者他住在哪个街道、楼层、6门牌找到这个人。

对象定位

webdriver提供了对象定位方法

  • find_element(type,value)
  • find_elements(type,value)
利用 By 类来确定哪种选择方式 
from selenium.webdriver.common.by import By
chrome.find_element(by=By.ID,value='su')

By 类的一些属性如下 :

  • ID = "id"
  • NAME = "name"
  • XPATH = "xpath"
  • LINK_TEXT = "link text"
  • PARTIAL_LINK_TEXT = "partial link text"
  • TAG_NAME = "tag name"
  • CLASS_NAME = "class name"
  • CSS_SELECTOR = "css selector"
操作元素 

前面讲到了不少知识都是定位元素,定位只是第一步,定位之后需要对这个原素进行操作。

鼠标点击呢还是键盘输入,这要取决于我们定位的是按钮还输入框。

一般来说,webdriver中比较常用的操作对象的方法有下面几个:

  • click 点击对象
  • send_keys 在对象上模拟按键输入
  • clear 清除对象的内容,如果可以的话
from selenium import webdriver
from selenium.webdriver.chrome.service
import Service
from time import sleep
from selenium.webdriver.common.by import Bydef test_element():# 创建驱动对象s =
Service(executable_path='./chromedriver.exe'
)# 创建一个浏览器driver = webdriver.Chrome(service=s)# 打个百度driver.get('https://cn.bing.com/')sleep(2)# 获取 搜索框,并输出“百战”driver.find_element(By.ID,'sb_form_q').send
_keys('百战')sleep(1)# 获取 搜索按钮,并点击driver.find_element(By.ID,'search_icon').cl
ick()
if __name__ =='__main__':test_element()

selenium定位下拉菜单

包含下拉菜单页面

<html><head><meta http-equiv="content-type"
content="text/html;charset=utf-8" /><title>Level Locate</title>    <script type="text/javascript"
src="https://cdn.jsdelivr.net/npm/jquery@1.1
2.4/dist/jquery.min.js"></script><link
href="https://cdn.jsdelivr.net/npm/@bootcss/
v3.bootcss.com@1.0.9/dist/css/bootstrap.min.
css" rel="stylesheet" />        </head><body><h3>Level locate</h3><div class="span3 col-md-3">        <div class="well"><div class="dropdown"><a class="dropdowntoggle" data-toggle="dropdown"href="#">Link1</a><ul class="dropdownmenu" role="menu" aria-labelledby="dLabel"
id="dropdown1" ><li><a tabindex="-1"
href="http://www.bjsxt.com">Action</a></li><li><a tabindex="-1"
href="#">Another action</a></li><li><a tabindex="-1"
href="#">Something else here</a></li><li class="divider">
</li><li><a tabindex="-1"
href="#">Separated link</a></li></ul></div>                </div> </div><div class="span3 col-md-3">        <div class="well"><div class="dropdown"><a class="dropdowntoggle" data-toggle="dropdown"
href="#">Link2</a><ul class="dropdownmenu" role="menu" aria-labelledby="dLabel" ><li><a tabindex="-1"
href="#">Action</a></li><li><a tabindex="-1"
href="#">Another action</a></li><li><a tabindex="-1"
href="#">Something else here</a></li><li class="divider">
</li><li><a tabindex="-1"
href="#">Separated link</a></li></ul></div>                </div>            </div></body><scriptsrc="https://cdn.jsdelivr.net/npm/@bootcss/v3.bootcss.com@1.0.9/dist/js/bootstrap.min.js">
</script>
</html>
from selenium import webdriver
11from selenium.webdriver.chrome.service
import Service
from selenium.webdriver.common.by import By
import os
from time import sleepdef test_down_menu():# 创建一个驱动s = Service(executable_path='./chromedriver.exe')# 创建浏览器driver = webdriver.Chrome(service=s)# 设置方位的文件地址file_path ='file:///'+os.path.abspath('./html/test01.html')# 访问页面driver.get(file_path)# 定位父级元素driver.find_element(By.LINK_TEXT,'Link1').click()# 找到要移动的位置menu =
driver.find_element(By.LINK_TEXT,'Action')# 做一个移动光标的动作# 定义一个动作在driver移动到     menu的位置     执行动作#webdriver.ActionChains(driver).move_to_element(menu).perform()# sleep(2)# 定位子级元素menu.click()# 睡眠2秒sleep(2)# 关闭浏览器driver.quit()
if __name__ == '__main__':test_down_menu()

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

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

相关文章

社交网络的分布式治理:分析Facebook在区块链社区中的角色

随着区块链技术的快速发展&#xff0c;社交网络的治理模式也逐渐受到关注。传统的社交网络往往由中心化的平台掌控&#xff0c;用户的权力和参与度受到限制&#xff0c;而区块链技术为社交网络的分布式治理提供了新的解决方案。本文将深入探讨社交网络的分布式治理&#xff0c;…

使用R语言计算矩形分布(均匀分布)并绘制图形

理论部分 矩形分布&#xff08;均匀分布&#xff09;&#xff0c;是指在某一区间内&#xff0c;随机变量取任何值的概率都是相同的。这种分布的概率密度函数在一个特定的区间内是一个常数&#xff0c;因此其图形呈现出一个矩形的形状&#xff0c;故得名为“矩形分布”。在概率…

ETLCloud结合kafka的数据集成

一、ETLCloud中实时数据集成的使用 在ETLCloud中数据集成有两种方式&#xff0c;一种是离线数据集成&#xff0c;另一种便是我们今天所要介绍的实时数据集成了&#xff0c;两者的区别从名字便可以得知&#xff0c;前者处理的数据是离线的没有时效性的&#xff0c;后者的数据是…

Python学习之-pyechart详解

前言&#xff1a; 什么是pyechart&#xff1f; Pyecharts 是一个用于生成 Echarts 图表的 Python 库。Echarts 是一个由百度开源的数据可视化工具&#xff0c;它提供的图表种类丰富&#xff0c;交互性强&#xff0c;兼容性好&#xff0c;非常适合用于数据分析结果的展示。Pyec…

高标清4K音视频编码处理平台JR600系列

详细介绍&#xff1a; JR600编码处理平台具备6个模组高集成化数字前端综合型设备&#xff0c;每个模块可单独配置&#xff0c;包括4x3G-SDI&#xff08;4KHEVC/H.265)超高清编码板卡、HD-SDI编码板卡、数字/模拟音频编码板卡、模拟视频编码板卡这些功能的组合。因该设备的高度…

酷开科技在大数据及人工智能推动下,成功将酷开系统与AI融合

随着科技的不断发展&#xff0c;以及大数据这个概念的出现&#xff0c;让看似冷冰冰的数字开始具备了温度&#xff0c;开始让数字产生了温暖的价值&#xff0c;也让各个行业看到了大数据的作用。酷开科技生态的核心场景是家庭、是客厅&#xff0c;无论是以酷开科技为代表的OTT&…

3. DAX 时间函数-- DATE 日期--一生二,二生三,三生万物

在数据分析过程中&#xff0c;经常需要从一个数据推到另外一个数据&#xff0c;日期数据也是如此&#xff0c;需要从一个日期推到另外一个相关的日期&#xff0c;或者从一群日期推到另外一个相关的日期/一群相关的日期。这一期说的就是日期之间彼此推衍的函数&#xff0c;会比之…

实战项目——智慧社区(一)

1、项目介绍 系统功能 登录、修改密码、登出 &#xff08;1&#xff09;首页 &#xff08;1.1&#xff09;数据统计&#xff1a;小区人员统计对比图&#xff0c;占比图 &#xff08;2&#xff09;物业管理 &#xff08;2.1&#xff09;小区管理&#xff1a;小区数据的增删改…

WordPress PHP内存限制优化,WordPress性能优化,提升WordPress PHP内存,防止内存溢出

它发生在所有WordPress网站所有者和管理员最终&#xff1a;可怕的WordPress内存错误。当你正在为自己的网站添加新的内容或媒体时&#xff0c;突然弹出一条消息&#xff1a;“致命错误&#xff1a;允许的内存大小为xxxxxx字节。”刚刚发生了什么&#xff1f;为什么WordPress会内…

【Vue + keep-alive】路由缓存

一. 需求 列表页&#xff0c;n 条数据项可打开 n 个标签页&#xff0c;同时1条数据项的查看和编辑共用一个标签页。如下所示&#xff1a; 参考 // 主页面 // 解决因 路由缓存&#xff0c;导致 编辑后跳转到该页面 不能实时更新数据 onActivated(() > {getList() })二. 实现…

电压继电器SRMUVS-220VAC-2H2D 导轨安装 JOSEF约瑟

系列型号&#xff1a; SRMUVS-58VAC-2H欠电压监视继电器&#xff1b;SRMUVS-100VAC-2H欠电压监视继电器&#xff1b; SRMUVS-110VAC-2H欠电压监视继电器&#xff1b;SRMUVS-220VAC-2H欠电压监视继电器&#xff1b; SRMUVS-58VAC-2H2D欠电压监视继电器&#xff1b;SRMUVS-100…

Spark_SparkSql写入Oracle_Undefined function.....将长字符串写入Oracle中方法..

在使用Spark编写代码将读库处理然后写入Oracle中遇到了诸多小bug,很磨人。shit!! 实测1&#xff1a;TO_CLOB(a3) 代码样例 --这是一个sparksql写入hive的一个小逻辑&#xff0c;我脱敏了噻 SELECT a1, a2, TO_CLOB(a3) AS clob_data, TO_DATE(a4) AS time FROM table1 WHERE…

2014最新AIGC创作系统ChatGPT网站源码+AI绘画网站源码+GPT4-All联网搜索模型

一、文章前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持…

鸿蒙HarmonyOS开发实战:【分布式音乐播放】

介绍 本示例使用fileIo获取指定音频文件&#xff0c;并通过AudioPlayer完成了音乐的播放完成了基本的音乐播放、暂停、上一曲、下一曲功能&#xff1b;并使用DeviceManager完成了分布式设备列表的显示和分布式能力完成了音乐播放状态的跨设备分享。 本示例用到了与用户进行交…

二:深入理解 JAVA 内存模型 JMM

目录 1、为什么要有内存模型1.1、为什么要有多级缓存&#xff1f;1.2、缓存一致性问题1.3、处理器优化和指令重排 2、并发编程的三大问题2.1、原子性问题2.2、有序性问题2.3、可见性问题2.4、三大特性 3、什么是内存模型&#xff1f;3.1、概念3.2、内存模型到底是怎么保证缓存一…

【Qt】:对话框(一)

对话框 一.基本的对话框二.自定义对话框三.通过图形化界面自定义对话框四.关于对话框mode 对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口&#xff0c;出现在程序最上层&#xff0c;用于实现短期任务或者…

小程序项目思路分享爬虫

小程序项目思路分享爬虫 具体需求&#xff1a; 有这几个就行&#xff0c;门店名称门店地址门店类型&#xff0c;再加上省、市、县/区门店名称&#xff1a;storeName 门店地址&#xff1a;storeAddress 程序运行&#xff1a; honor_spider获取经纬度信息。 经纬度——>详…

CentOS上使用cgroup限制进程使用内存

安装cgroup 要使用cgroup首先需要系统支持&#xff0c;需要安装两个rpm包 yum install libcgroup libcgroup-tools 创建限制内存的cgroup组 cgroup组需要在/sys/fs/cgroup/memory目录下创建&#xff0c;我们创建一个限制进程内存大小为10M的cgroup组&#xff0c;这个组中内存…

云计算重要概念之:虚拟机、网卡、交换机、路由器、防火墙

一、虚拟机 (Virtual Machine, VM) 1.主流的虚拟化软件&#xff1a; 虚拟化软件通过在单个物理硬件上创建和管理多个虚拟环境&#xff08;虚拟机&#xff09;&#xff0c;实现资源的高效利用、灵活部署、隔离安全以及便捷管理&#xff0c;是构建云计算和现代化数据中心的核心…

【Linux】初识Linux,虚拟机安装Linux系统,配置网卡

前言 VMware软件&#xff1a;首先&#xff0c;确保您已经下载了VMware Workstation软件并安装在电脑上。VMware Workstation是一款功能强大的虚拟化软件&#xff0c;它允许在单一物理机上运行多个操作系统。 Linux镜像文件&#xff1a;需要准备一个Linux操作系统的镜像文件。…