基于Python +Selenium的爬虫详解

今天我们来详细学习一些 selenium 的强大用法

一、selenium简介

由于requests模块是一个不完全模拟浏览器行为的模块,只能爬取到网页的HTML文档信息,无法解析和执行CSS、JavaScript代码,因此需要我们做人为判断;

1、什么是selenium

selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法执行javaScript代码的问题。
selenium模块本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器;由于selenium解析执行了CSS、JavaScript所以相对requests它的性能是低下的;

2、selenium的用途

1)selenium可以驱动浏览器自动执行自定义好的逻辑代码,也就是可以通过代码完全模拟成人类使用浏览器自动访问目标站点并操作,那我们也可以拿它来做爬虫。
2)selenium本质上是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等…进而拿到网页渲染之后的结果,可支持多种浏览器

二、selenium的安装与测试

1、下载selenium模块:

pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium
或者在pycharm中下载

2、安装浏览器驱动

  1. Google浏览器驱动(在下载驱动之前,查看一下chrome浏览器的版本号,如下:

国内镜像网站地址:http://npm.taobao.org/mirrors/chromedrive


当然也可以去官网找最新的版本,官网: https://sites.google.com/a/chromium.org/chromedriver/downloads

另外注意:把下载好的chromedriver.exe放到python安装路径的scripts目录中即可

  1. firefox浏览器驱动

selenium3默认支持的webdriver是Firfox,而Firefox需要安装geckodriver

下载链接:https://github.com/mozilla/geckodriver/releases

  1. 测试是否安装成功

import time
from selenium import webdriver
browser=webdriver.Chrome() 
#实例化1个谷歌浏览器对象
browser.get('https://www.baidu.com/')  
time.sleep(5)
browser.close()

三、selenium的使用

所谓模拟浏览器基本就是下面的流程:

1.请求

2.显示页面

3.查找元素

4.点击可点击元素

所以如何使用selenium找到页面中的标签,进而触发标签事件,就会变的尤为重要

1. selenium选择器

要想定位页面的元素,selenium也提供了一系列的方法。

  1. 通过标签id属性进行定位

browser.find_element_by_id('kw') # 其中kw便是页面中某个元素的id值
  1. 通过标签name属性进行定位

# 两种方式是一样的
browser.find_element_by_name("wd") # 其中wd是页面中某个元素的name值
  1. 通过标签名进行定位
browser.find_element_by_tag_name("img") # img参数表示的就是图片标签img
  1. 通过CSS查找方式进行定位
browser.find_elements_by_css_selector("#kw") # 根据选择器进行定位查找,其中#kw表示的是id选择器名称是kw的
  1. 通过xpath方式定位

browser.find_element_by_xpath('//*[@id="kw"]') # 参数即是xpath的语法
  1. 通过搜索页面中链接进行定位

有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过link


browser.find_element_by_link_text("设置")

通过搜索页面中链接进行定位 ,可以支持模糊匹配**

browser.find_element_by_partial_link_text("百度") # 查找页面所有的含有百度的文字链接

2. selenium显示等待和隐式等待

显示等待:就是明确要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,就会跳出异常Exception

操作格式:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

WebDriverWait()一般由until()或 until_not()方法配合使用 until(method, message=’ ‘):调用该方法提供的驱动程序作为一个参数,直到返回值为True until_not(method, message=’ '):调用该方法提供的驱动程序作为一个参数,直到返回值为False


from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import Bydriver = webdriver.chrome()
driver.get('http://www.baidu.com')element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw")))
element.send_keys('selenium')

隐式等待:就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。

注意:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内部断的刷新页面去寻找我们需要的元素


driver.implicitly_wait() 默认设置为0

例如:driver.implicitly_wait(10) 。如果元素在10s内定位到了,继续执行。如果定位不到,将以循环方式判断元素是否被定位到。如果在10s内没有定位到,则抛出异常

from selenium import webdriverdriver = webdriver.chrome()
driver.get('http://www.baidu.com')
# 隐式等待10秒
driver.implicitly_wait(10)

另外还有一种就是我们常用的sleep,我们称为:强制等待。有时候我们希望脚本在执行到某一位置时暂停一段时间等待页面加载,这时可以使用sleep()方法。sleep()方法会固定休眠一定的时长,然后再继续执行。sleep()方法默认参数以秒为单位。

from time import sleep
from selenium import webdriverdriver = webdriver.chrome()
driver.get('http://www.baidu.com')
# 强制休眠2秒
sleep(2)
driver.find_element_by_id("kw").send_keys("selenium")

3. 元素交互操作

用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击、双击、点击鼠标右键、拖拽(滑动验证)等等。而selenium给我们提供了一个类来处理这类事件——ActionChains;


selenium.webdriver.common.action_chains.ActionChains(driver)

这个类基本能够满足我们所有对鼠标操作的需求。

  1. actionChains的基本使用

首先需要了解ActionChains的执行原理,当你调用ActionChains的方法时,不会立即执行,而是会将所有的操作按顺序存放在一个队列里,当你调用perform()方法时,队列中的时间会依次执行。

这种情况下我们可以有两种调用方法:

链式写法


menu = driver.find_element_by_css_selector(".div1")
hidden_submenu =    driver.find_element_by_css_selector(".div1 #menu1")
ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()

分步写法


menu = driver.find_element_by_css_selector(".div1")
hidden_submenu = driver.find_element_by_css_selector(".div1 #menu1")actions = ActionChains(driver)
actions.move_to_element(menu)
actions.click(hidden_submenu)
actions.perform()

两种写法本质是一样的,ActionChains都会按照顺序执行所有的操作。

  1. actionChains方法列表

click(on_element=None) ——单击鼠标左键
click_and_hold(on_element=None) ——点击鼠标左键,不松开
context_click(on_element=None) ——点击鼠标右键
double_click(on_element=None) ——双击鼠标左键
drag_and_drop(source, target) ——拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
key_down(value, element=None) ——按下某个键盘上的键
key_up(value, element=None) ——松开某个键
move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
move_to_element(to_element) ——鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置
perform() ——执行链中的所有动作
release(on_element=None) ——在某个元素位置松开鼠标左键
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素

示例代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import timetry:driver = webdriver.Chrome()driver.implicitly_wait(10)# 1、往jd发送请求driver.get('https://www.jd.com/')# 找到输入框输入围城input_tag = driver.find_element_by_id('key')input_tag.send_keys('华为')# 键盘回车input_tag.send_keys(Keys.ENTER)time.sleep(2)# 找到输入框输入墨菲定input_tag = driver.find_element_by_id('key')input_tag.clear()input_tag.send_keys('樊登读书')# 找到搜索按钮点击搜索button = driver.find_element_by_class_name('button')button.click()time.sleep(10)finally:driver.close()

或者前进后退相关


import time
from selenium import webdriverbrowser = webdriver.Chrome()
browser.get('https://www.cnblogs.com/xuanyuan/')browser.find_element_by_partial_link_text('我是如何把计算机网络考了100分的?').click()time.sleep(3)
browser.back()  # 后退
time.sleep(3)
browser.forward()  # 前进
time.sleep(5)
browser.close()

四、综合案例


import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC  # available since 2.26.0
from selenium.webdriver.support.ui import WebDriverWait  # available since 2.4.0
from selenium.webdriver.support import expected_conditionsimport pandas as pdclass MyCrawler(object):def __init__(self):self.path = "./data"if not os.path.exists(self.path):os.mkdir(self.path)self.driver = webdriver.Chrome()self.base_url = "http://data.house.163.com/bj/housing/trend/district/todayprice/{date:s}/{interval:s}/allDistrict/1.html?districtname={disname:s}#stoppoint"self.data = Nonedef craw_page(self, date="2020.01.01-2020.12.30", interval="month", disname="全市"):driver = self.driverurl = self.base_url.format(date=date, interval=interval, disname=disname)driver.get(url)try:WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "resultdiv_1")))self.data = pd.DataFrame()ct = Truewhile ct:self.get_items_in_page(driver)e_pages = driver.find_elements_by_xpath('//div[@class="pager_box"]/a[@class="pager_b current"]/following::a[@class="pager_b "]')if len(e_pages) > 0:next_page_num = e_pages[0].texte_pages[0].click()# 通过判断当前页是否为我们点击页面的方式来等待页面加载完成WebDriverWait(driver, 10).until(expected_conditions.text_to_be_present_in_element((By.XPATH, '//a[@class="pager_b current"]'),next_page_num))else:ct = Falsebreareturn self.datafinally:driver.quit()def get_items_in_page(self, driver):e_tr = driver.find_elements_by_xpath("//tr[normalize-space(@class)='mBg1' or normalize-space(@class)='mBg2']")temp = pd.DataFrame(e_tr, columns=['web'])temp['时间'] = temp.web.apply(lambda x: x.find_element_by_class_name('wd2').text.split(' ')[0])temp['套数'] = temp.web.apply(lambda x: x.find_element_by_class_name('wd5').text)temp['均价'] = temp.web.apply(lambda x: x.find_element_by_class_name('wd7').text)temp['去化'] = temp.web.apply(lambda x: x.find_element_by_class_name('wd14').text)del temp['web']self.data = pd.concat([temp, self.data], axis=0)mcraw = MyCrawler()
data = mcraw.craw_page()data= data.sort_values(by='时间')
print(data.to_string(index=False))

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

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

相关文章

PowerShell——多任务后台作业

PowerShell——多任务后台作业 实验环境:操作系统为Windows8(或之后)或者Windows Server2012(或之后)运行PowerShell v3或更新版本的计算机 任务: 创建一个后台作业获取计算机上系统事件日志中最近的26条错误记录,之后将记录导出…

算法与人生 揭秘C语言中高效搜索的秘诀——二分查找算法详解

引言,少年们,大家好。在这里祝大家元旦快乐,我是博主那一脸阳光,今天来介绍二分查找 在计算机科学领域,搜索算法是数据处理和问题解决的重要工具之一。其中,**二分查找算法(Binary Search&#…

Git开发工具基本使用

文章目录 前言Git仓库基本概念基本环境安装清除原先配置生成秘钥配置Host添加公钥Github添加Gitee添加测试 本地仓库基本概览查看提交日志(log)版本回退添加文件至忽略列表分支分支冲突 远程仓库推送到远程仓库从远程仓库中抓取和拉取 在Idea中使用Git总结 前言 这里只是对Git…

Perforce:2024年改变数字化格局的五大技术趋势

自去年ChatGPT发布以来,生成式人工智能占据了头条、会议,甚至占据了我自己工作场合的对话。人工智能技术如此迅速地改变工作流程和公司的关注点,真是令人难以置信。 我叫瑞安,在技术领域工作了近二十年,拥有15年的全栈…

图像分割实战-系列教程3:unet医学细胞分割实战1(医学数据集、图像分割、语义分割、unet网络、代码逐行解读)

🍁🍁🍁图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 unet医学细胞分割实战1 unet医学细胞分割实战2 unet医学细胞分割实战3 unet医学细胞分割实战4 unet…

计算图与动态图机制

一、计算图 计算图是用来描述运算的有向无环图 计算图有两个主要元素:结点(Node)和边(Edge) 结点表示数据,如向量,矩阵,张量边表示运算,如加减乘除卷积等 用计算图表…

redis安装与配置(Ubuntu)

目录 1. 切换到 root 用户 2. 搜索安装包 3. 安装 redis 4. 查看 redis 是否正常存在 5. 修改ip 6. 重新启动服务器 7. 连接服务器 1. 切换到 root 用户 通过 su 命令切换到 root 用户。 2. 搜索安装包 apt search redis 这里安装的是下面的版本: 3. 安装 …

LaTeX写论文,公式后段落取消缩进方法:\noindent

在论文的段落中,需要插入一个公式,按道理公式后应该紧接着是段落的文本内容,但如果直接写的话,编译得到的PDF中呈现出来的却是开头缩进的样子 如果需要取消公式后面的段落缩进,可以使用命令 \noindent 该命令的作用…

从零开始 - 在Python中构建和训练生成对抗网络(GAN)模型

生成对抗网络(GANs)是一种强大的生成模型,可以合成新的逼真图像。通过完整的实现过程,读者将对GANs在幕后的工作原理有深刻的理解。本教程首先导入必要的库并加载将用于训练GAN的Fashion-MNIST数据集。然后,提供了构建…

反转链表、链表的中间结点、合并两个有序链表【LeetCode刷题日志】

一、反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 思路一:翻转单链表指针方向 这里解释一下三个指针的作用: n1&#xff1…

Jupyter Notebook的10个常用扩展介绍

Jupyter Notebook(前身为IPython Notebook)是一种开源的交互式计算和数据可视化的工具,广泛用于数据科学、机器学习、科学研究和教育等领域。它提供了一个基于Web的界面,允许用户创建和共享文档,这些文档包含实时代码、…

(15)Linux 进程创建与终止函数forkslab 分派器

前言:本章我们主要讲解进程的创建与终止,最后简单介绍一下 slab 分派器。 一、进程创建(Process creation) 1、分叉函数 fork 在 中, fork 函数是非常重要的函数,它从已存在进程中创建一个新的进程。 …

1885页学习资料。一本在手,python不愁!

python3.11即将于下半年发布,新的版本速度提升2倍,以弥补与其他编程语言在速度上的缺陷。可以预见Python语言在未来的应用范围会越来越广。 python学习方向建议: 如果你是本科及以下学历,建议你学习以下两个方向 1、爬虫。简单…

Matplotlib基础

目录: 一、绘制yx^2图像: 一、绘制yx^2图像: from matplotlib import pyplot as plt import numpy as np #生成(-50,50)的数组 x np.arange(-50,50) #计算因变量y的值 y x ** 2 #根据x、y数组绘制图形yx^2 plt.plot…

一文带你玩转Superset!大数据可视化框架学习网站大盘点!

介绍:Superset是一款由Airbnb开源的现代化企业级BI工具,它主要用于数据分析和可视化工作。作为Apache孵化器项目的一部分,它在处理复杂的数据分析需求上表现出色,并支持多种数据源和丰富的图表类型。 这款工具的主要特点包括自助分…

PE解释器之PE文件结构

PE文件是由许许多多的结构体组成的,程序在运行时就会通过这些结构快速定位到PE文件的各种资源,其结构大致如图所示,从上到下依次是Dos头、Nt头、节表、节区和调试信息(可选)。其中Dos头、Nt头和节表在本文中统称为PE文件头(因为SizeOfHeaders…

大数据毕业设计:基于python淘宝数据采集分析可视化系统 商品销量数据分析 计算机毕业设计(附源码+文档)✅

毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议收藏) 毕业设计:2023-2024年最新最全计算机专业毕设选题推荐汇总 🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题&#xff…

微软真是活菩萨,面向初学者的机器学习、数据科学、AI、LLM课程统统免费

微软真是活菩萨,面向初学者的机器学习、数据科学、AI、LLM课程统统免费 大家好,我是老章 推荐几个质量上乘且完全免费的微软开源课程 面向初学者的机器学习课程 **地址:**https://microsoft.github.io/ML-For-Beginners/#/ 学习经典机器学…

Mysql 下载与安装教程(详细介绍与总结)

一:版本介绍 首先,我们需要先进入官网进行下载,在官网中有好几个版本,那么这里我分别简述一下MySQL各个版本区别: 1:企业版,MySQL Enterprise Edition 需要付费的,可以免费试用30天…