Python爬虫基础(三):使用Selenium动态加载网页

2023-09-14 09:33:46

系列文章索引

Python爬虫基础(一):urllib库的使用详解
Python爬虫基础(二):使用xpath与jsonpath解析爬取的数据
Python爬虫基础(三):使用Selenium动态加载网页
Python爬虫基础(四):使用更方便的requests库
Python爬虫基础(五):使用scrapy框架

一、Selenium简介

1、什么是selenium?

(1)Selenium是一个用于Web应用程序测试的工具。
(2)Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。
(3)支持通过各种driver(FirfoxDriver,IternetExplorerDriver,OperaDriver,ChromeDriver)驱动真实浏览器完成测试。
(4)selenium也是支持无界面浏览器操作的。

模拟浏览器功能,自动执行网页中的js代码,实现动态加载

2、为什么使用selenium

我们打开京东,看到有一个秒杀的模块,从网页源码中也可以定位到:
在这里插入图片描述
但是我们使用urllib爬取:

import urllib.request

url = 'https://www.jd.com/'
urllib.request.urlretrieve(url,'jd.html')

爬取的网页,我们全局搜索发现,并没有秒杀这部分内容。

因为秒杀这部分内容,是在js中动态加载的,而selenium就可以模拟浏览器功能,自动执行网页中的js代码,实现动态加载

3、安装selenium

(1)谷歌浏览器驱动下载安装

查看谷歌浏览器的版本:帮助->关于google chrome,查看版本。

根据版本查找对应的chromedriver,大版本对应就可以,小版本不需要关心,下载地址(第一个网速比较慢),32位和64位都能用:
http://chromedriver.storage.googleapis.com/index.html
https://registry.npmmirror.com/binary.html?path=chromedriver/
在这里插入图片描述
在这里插入图片描述

如果是最新版的谷歌浏览器,以上可能没有同步更新,试试下面的网站:
https://googlechromelabs.github.io/chrome-for-testing/

下载之后是一个压缩文件。
在这里插入图片描述

将解压出来的exe文件,放到python项目的根目录下(为了方便使用,不这样做的话,使用时指定路径也可)。

(2)安装selenium

# 进入到python安装目录的Scripts目录
d:
cd D:\python\Scripts
# 安装
pip install selenium -i https://pypi.douban.com/simple

二、Selenium使用

1、简单使用

简单三步,轻松使用,获取网页的全部内容(网页完全加载完毕之后的)。

# (1)导入selenium
from selenium import webdriver

# (2) 创建浏览器操作对象,就是指定我们驱动的路径
path = 'chromedriver.exe'

browser = webdriver.Chrome(path)

# (3)访问网站

url = 'https://www.jd.com/'

browser.get(url)

# page_source获取网页源码
content = browser.page_source
with open('jd.html','w',encoding='utf-8') as fp:
    fp.write(content)

2、元素定位

元素定位:自动化要做的就是模拟鼠标和键盘来操作来操作这些元素,点击、输入等等。操作这些元素前首先要找到它们,WebDriver提供很多定位元素的方法。

from selenium import webdriver
from selenium.webdriver.common.by import By

path = 'chromedriver.exe'
browser = webdriver.Chrome(path)

url = 'https://www.baidu.com'
browser.get(url)

# 元素定位

# 根据id来找到对象 id = su
button = browser.find_element(by = By.ID, value = 'su')
print(button)

# 根据标签属性的属性值来获取对象的 name = wd
button = browser.find_element(by = By.NAME, value = 'wd')
print(button)

# 根据xpath语句来获取对象 xpath语法
button = browser.find_element(by = By.XPATH, value = '//input[@id="su"]')
print(button)

# 根据标签的名字来获取对象
button = browser.find_element(by = By.TAG_NAME, value = 'input')
print(button)

# 使用的bs4的语法来获取对象
button = browser.find_element(by = By.CSS_SELECTOR, value = '#su')
print(button)

# 获取链接文本
button = browser.find_element(by = By.LINK_TEXT, value = '百度一下')
print(button)

By参数 包含许多可选的选项:
在这里插入图片描述

3、获取元素信息

from selenium import webdriver
from selenium.webdriver.common.by import By

path = 'chromedriver.exe'
browser = webdriver.Chrome(path)

url = 'http://www.baidu.com'
browser.get(url)

input = browser.find_element(by = By.ID, value = 'su')

# 获取标签的属性 获取class属性
print(input.get_attribute('class'))
# 获取标签的名字
print(input.tag_name)

# 获取元素文本
a = browser.find_element(by = By.LINK_TEXT, value = '新闻')
print(a.text)

4、交互

from selenium import webdriver
from selenium.webdriver.common.by import By

# 创建浏览器对象
path = 'chromedriver.exe'
browser = webdriver.Chrome(path)

# url
url = 'https://www.baidu.com'
browser.get(url)

# 休眠2秒
import time
time.sleep(2)

# 获取文本框的对象
input = browser.find_element(by = By.ID, value = 'kw')

# 在文本框中输入周杰伦
input.send_keys('周杰伦')

time.sleep(2)

# 获取百度一下的按钮
button = browser.find_element(by = By.ID, value = 'su')

# 点击按钮
button.click()

time.sleep(2)

# 滑到底部
js_bottom = 'document.documentElement.scrollTop=100000'
browser.execute_script(js_bottom)

time.sleep(2)

# 获取下一页的按钮
next = browser.find_element(by = By.XPATH, value = '//a[@class="n"]')

# 点击下一页
next.click()

time.sleep(2)

# 回到上一页
browser.back()

time.sleep(2)

# 回去
browser.forward()

time.sleep(3)

# 退出
browser.quit()

三、Phantomjs使用(停更)

1、什么是Phantomjs

(1)是一个无界面的浏览器
(2)支持页面元素查找,js的执行等
(3)由于不进行css和gui渲染,运行效率要比真实的浏览器要快很多

Phantomjs已经过时了,推荐使用Chrome handless,高版本的Selenium已经不支持Phantomjs了

2、下载

官网:http://wenku.kuryun.com/docs/phantomjs/download.html
在这里插入图片描述
将下载的phantomjs.exe文件拷贝到项目目录(为了方便使用,不这样做的话,使用时指定路径也可)。

3、使用Phantomjs

(1)获取PhantomJS.exe文件路径path
(2)browser = webdriver.PhantomJS(path)
(3)browser.get(url)
扩展:保存屏幕快照:browser.save_screenshot(‘baidu.png’)

from selenium import webdriver

path = 'phantomjs.exe'

browser = webdriver.PhantomJS(path)


url = 'https://www.baidu.com'
browser.get(url)
# 保存快照
browser.save_screenshot('baidu.png')

import time
time.sleep(2)
# 最新版selenium不支持该语法
input = browser.find_element_by_id('kw')
input.send_keys('昆凌')

time.sleep(3)

browser.save_screenshot('kunling.png')

四、Chrome handless无界面模式

1、简介

Chrome-headless 模式, Google 针对 Chrome 浏览器 59版 新增加的一种模式,可以让你不打开UI界面的情况下使用 Chrome 浏览器,所以运行效果与 Chrome 保持完美一致,性能更高。

系统要求:
Chrome:Unix\Linux 系统需要 chrome >= 59、Windows 系统需要 chrome >= 60
Python3.6 +
Selenium3.4.* +
ChromeDriver
2.31 +

2、基本使用

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

def share_browser():
    '''
        该方法的内容,都不需要动,只需要修改自己的chrome浏览器路径
    '''
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')

    # path是你自己的chrome浏览器的文件路径
    path = r'C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe'
    chrome_options.binary_location = path

    browser = webdriver.Chrome(chrome_options=chrome_options)
    return browser

browser = share_browser()

url = 'https://www.baidu.com'

browser.get(url)

browser.save_screenshot('baidu.png')

更多推荐

Node.js 20 —— 几个令人大开眼界的特性

前言:欢迎来到Node.js20Node.js20已经发布,带来了创新和激动人心的新时代。这个开创性的版本于2023年4月18日首次亮相,并将在2023年10月发布长期支持(LTS)版本,并且将持续支持至2026年4月,下面小编就为大家介绍一下Node.js20的几个新特性:1.Node.js权限访问Node.js20

JS案例:在浏览器实现自定义菜单

目录前言设计思路BaseElemMenuCustomElementBaseDragDragResize最终效果总结相关代码前言分享一下之前公司实现自定义菜单的思路,禁用浏览器右键菜单,使用自定义的菜单将其代替,主要功能有:鼠标右键调出菜单,双击选中/取消选中标签,新建标签,删除标签,调整位置,调整大小,取消拖拽,关闭菜

详解JS中常见的5 种 for 循环

for循环在平时开发中使用频率最高的,前后端数据交互时,常见的数据类型就是数组和对象,处理对象和数组时经常使用到for遍历,因此需要彻底搞懂这5种for循环。它们分别为:forfor...infor...offorawait..offorEachmap一、各个for介绍1、forfor循环是出现最早,也是应用最普遍的一

联表查询 && 索引 && 事务 && JDBC使用 &&CPU工作原理 && 线程概念 && Thread类的用法

第1题(单选题)题目名称:已知表T1中有2行数据,T2中有3行数据,执行SQL语句,“selecta.*fromT1a,T2b”后,返回的行数为题目内容:A.2B.3C.5D.6第2题(单选题)题目名称:Mysql查询时,只有满足联接条件的记录才包含在查询结果,这种联接是题目内容:A.左联接B.右联接C.内联接D.全联

Vue.js和TypeScript:如何完美结合

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

Redis SCAN命令操作实战(详细)

目录SCAN介绍SCAN命令基本用法MATCH选项用法COUNT选项用法TYPE选项用法补充并发执行多个迭代中途停止迭代使用错误的游标进行增量式迭代迭代终结的保证SCAN介绍SCANcursor[MATCHpattern][COUNTcount][TYPEtype]:SCAN命令及其相关的SSCAN命令、HSCAN命令

抽象轻松的C语言

四个基本元素标识符,数据,运算符,关键字标识符:是指计算机用来识别信息的符号数据:是事物或观察的结果运算符,关键字:具体内容具体分析由四个基本元素组合成6个基本语句标号语句,复合语句,表达式语句,选择语句,迭代语句,跳转语句PS:之前的那个标识语句呢?在最近的疯狂啃食之下,出现了点问题,于是我回过头重看不看不知道,一看

接口自动化中cookies的处理技术

一,理论知识为什么有cookie和session?因为http协议是一种无状态的协议,即每次服务端接受到客户端的请求时都时一个全新的请求,服务器并不知道客户端的请求记录,session和cookie主要目的就是弥补http的无状态特性cookiecookie是服务器发送到用户浏览器并保存到用户本地的一小块数据,会在浏览

C语言进阶第三课-----------指针的进阶----------后续版

作者前言🎂✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂​🎂作者介绍:🎂🎂🎂🎉🎉🎉🎉🎉🎉🎉🎂🎂作者id:老秦包你会,🎂简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨🎂🎂🎂🎂🎂

SpringCloud Ribbon--负载均衡 原理及应用实例

😀前言本篇博文是关于SpringCloudRibbon的基本介绍,希望你能够喜欢🏠个人主页:晨犀主页🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰如果文章有什么需要改进的地方还请大佬不吝赐教先

Redis快速入门及在Java中使用Redis

哈喽~大家好,这篇来看看Redis快速入门及在Java中使用Redis。🥇个人主页:个人主页​​​​​🥈系列专栏:【微服务】🥉与这篇相关的文章:SpringCloudSentinel使用SpringCloudSentinel使用_程序猿追的博客-CSDN博客SpringCloud网关GatewaySpringCl

热文推荐