Python下利用Selenium获取动态页面数据

news2024/12/26 19:07:23

利用python爬取网站数据非常便捷,效率非常高,但是常用的一般都是使用BeautifSoup、requests搭配组合抓取静态页面(即网页上显示的数据都可以在html源码中找到,而不是网站通过js或者ajax异步加载的),这种类型的网站数据爬取起来较简单。但是有些网站上的数据是通过执行js代码来更新的,这时传统的方法就不是那么适用了。这种情况下有如下几种方法:

  清空网页上的network信息,更新页面,观察网页发送的请求,有些网站可以通过这种方法构造参数,从而简化爬虫。但是适用范围不够广泛。

  使用selenium模拟浏览器行为更新网页获取更新后的数据。本文接下来着重讲述这种方法。

一、准备工作

  模拟浏览器需要用到两个工具:

  1.selenium,可直接通过pip install selenium进行安装。

  2.PhantomJS,这是一个无界面的,可脚本编程的WebKit浏览器引擎,百度进行搜索,在其官网下进行下载,下载后无需安装,放到指定路径下,在使用时只需指定文件所在路径即可。

二、使用selenium模拟浏览器

  本文爬取网站示例为:http://datacenter.mep.gov.cn:8099/ths-report/report!list.action?xmlname=1465594312346(最新测试发现网站已无法打开,2021年5月25日)

  学习示例时请不要爬取太多页面,走一遍流程了解怎么抓就行。

  打开网站后,可以看到需要爬取的数据为一个规则的表格,但是有很多页。

在这个网站中,点击下一页页面的url不发生变化,是通过执行一段js代码更新页面的。因此本文思想就是利用selenium模拟浏览器进行点击,点击“下一页”后页面数据进行更新,获取更新后的页面数据即可。下面是完整代码:

  1. # -*- coding:utf-8 -*-

  2.   import requests

  3.   from bs4 import BeautifulSoup

  4.   import json

  5.   import time

  6.   from selenium import webdriver

  7.   import sys

  8.   reload(sys)

  9.   sys.setdefaultencoding( "utf-8" )

  10.   curpath=sys.path[0]

  11.   print curpath

  12.   def getData(url):

  13.    # 使用下载好的phantomjs,网上也有人用firefox,chrome,但是我没有成功,用这个也挺方便

  14.   driver =webdriver.PhantomJS(executable_path="C:/phantomjs.exe")

  15.   driver.set_page_load_timeout(30)

  16.   time.sleep(3)

  17.   html=driver.get(url[0]) # 使用get方法请求url,因为是模拟浏览器,所以不需要headers信息

  18.   for page in range(3):

  19.   html=driver.page_source # 获取网页的html数据

  20.   soup=BeautifulSoup(html,'lxml') # 对html进行解析,如果提示lxml未安装,直接pip install lxml即可

  21.   table=soup.find('table',class_="report-table")

  22.   name=[]

  23.   for th in table.find_all('tr')[0].find_all('th'):

  24.   name.append(th.get_text()) # 获取表格的字段名称作为字典的键

  25.   flag=0 # 标记,当爬取字段数据是为0,否则为1

  26.   for tr in table.find_all('tr'):

  27.   # 第一行为表格字段数据,因此跳过第一行

  28.   if flag==1:

  29.   dic={}

  30.   i=0

  31.   for td in tr.find_all('td'):

  32.   dic[name[i]]=td.get_text()

  33.   i+=1

  34.   jsonDump(dic,url[1])#保存数据

  35.   flag=1

  36.    # 利用find_element_by_link_text方法得到下一页所在的位置并点击,点击后页面会自动更新,只需要重新获取driver.page_source即可

  37.   driver.find_element_by_link_text(u"下一页").click()

  38.   

  39.   def jsonDump(_json,name):

  40.   """store json data"""

  41.   with open(curpath+'/'+name+'.json','a') as outfile:

  42.   json.dump(_json,outfile,ensure_ascii=False)

  43.   with open(curpath+'/'+name+'.json','a') as outfile:

  44.   outfile.write(',\n')

  45.   if __name__ == '__main__':

  46.   url=['http://datacenter.mep.gov.cn:8099/ths-report/report!list.action?xmlname=1465594312346','yzc'] # yzc为文件名,此处输入中文会报错,前面加u也不行,只好保存后手动改文件名……

  47.   getData(url) # 调用函数

本文中获取下一页的位置是通过driver.find_element_by_link_text方法来实现的,这是因为在此网页中,这个标签没有唯一可标识的id,也没有class,如果通过xpath定位的话,第一页和其他页的xpath路径又不完全相同,需要加个if进行判断。因此直接通过link的text参数进行定位。click()函数模拟在浏览器中的点击操作。

  selenium的功能非常强大,用在爬虫上能够解决很多一般爬虫解决不了的问题,它可以模拟点击、鼠标移动,可以提交表单(应用如:登陆邮箱账号、登陆wifi等,网上有很多实例,本人暂时还没有尝试过),当你遇到一些非常规的网站数据爬取起来非常棘手时,不妨尝试一下selenium+phantomjs。

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

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

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

相关文章

【趣学Python算法100例】冒泡排序

问题描述 对N个整数(数据由键盘输入)进行升序排列。 问题分析 要整理一组相同类型的数,我们可以用一个叫数组的工具来存放它们。冒泡排序,就是通过一次次比较相邻的两个数并交换位置,让原本乱糟糟的数组变得井井有条…

Python画笔案例-066 绘制橙子

1、绘制橙子 通过 python 的turtle 库绘制 橙子,如下图: 2、实现代码 绘制 橙子,以下为实现代码: """橙子.py注意亮度为0.5的时候最鲜艳本程序需要coloradd模块支持,安装方法:pip install coloradd程序运行需要很长时间,请耐心等待。可以把窗口最小化,然后…

【源码+文档+调试讲解】汽车维修管理系统的设计与实现

摘 要 随着计算机技术的高速发展,现代计算机系统已经从以计算为中心向以信息化处理为中心的方向发展。而汽车维修,不仅需要在硬件上为现代社会的人们提供一个汽车维修的平台,获取汽车知识的环境,更要在软件上为车辆提供汽车维修的…

记一次京东自营广电流量卡踩坑

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 最近由于竞合,电信和联通的大流量卡都下架了,29 元的长期套餐流量最多只有 80G 了,想要长期大流量卡只剩下广电这一个选择了。光从套餐上来看 29 元 192G 的流量还是很诱…

Shell 脚本学习

Shell学习 Shell 脚本 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服…

安装了 cursor 之后,我写代码不用手了

最近新一代 AI 编程助手 cursor 爆火。 Cloudflare 副总裁家的 8 岁女儿在 45 分钟内用它搭起了一个聊天机器人。 这个女孩甚至不会编程,只是通过输入一些简单的 prompt 就完成了这样一个聊天机器人。 如果我们通过 RPA 或者智能体的方式,将语音直接转…

著名建筑物检测与识别系统源码分享

著名建筑物检测与识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

c++算法第二天

温馨提示:本篇文章适合刚开始练算法的小白,大佬若见勿嘲 题目 题目解析 遇到0写两遍,非0写一遍,其余非零数右移即可 编写原理 第一步找到最后一个被复写的数 先根据题目所给的例子找到最后一次要复写的数字 20240923_142843 第…

【AI学习】Lilian Weng:Extrinsic Hallucinations in LLMs(LLM 的外在幻觉)

来自OpenAI 的 Lilian Weng的《Extrinsic Hallucinations in LLMs》 Date: July 7, 2024 | Estimated Reading Time: 30 min | Author: Lilian Weng 文章链接:https://lilianweng.github.io/posts/2024-07-07-hallucination/ 大概看了一下,这篇文章的核…

重新拉取maven-jar包

问题:经常会出现这种情况:一个项目重新打包之后,在另外一个项目中无法引用。可以尝试一下解决方式 1:右上角重新拉取: 2:清理所有缓存:idea-file-invalidate Caches 3:设置拉取方式&#xff…

【论文速看】DL最新进展20240926-图像分割、图像修复、CNN

目录 【图像分割】【图像修复】【CNN】 【图像分割】 [2024] CAD: Memory Efficient Convolutional Adapter for Segment Anything 论文链接:https://arxiv.org/pdf/2409.15889 代码链接:https://github.com/Kyyle2114/Convolutional-Adapter-for-Segme…

Linux防火墙-什么是防火墙

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 什么是防火墙 我们想象一下把每台服务器当成一个小区,我们去访问另外一个小区的朋友,我们需要经过什…

什么是开放式耳机?具有什么特色?非常值得入手的蓝牙耳机推荐

开放式耳机是当下较为热门的一种耳机类型。它具有以下特点: 设计结构: 呈现开放式的构造,不会完全堵住耳道。如此一来,外界声音能够较容易地被使用者听到,在使用耳机时可以保持对周围环境的察觉。比如在户外&#xf…

每日一练:二叉搜索树中第K小的元素

230. 二叉搜索树中第 K 小的元素 - 力扣(LeetCode) 一、题目要求 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。 示例 1: 输入&a…

配置anaconda环境变量的影响

配置anaconda环境变量的影响 配置虚拟机的过程:拉取一个配置为pytorch1.12.0-python3.7的docker镜像,创建虚拟机。创建好了之后验证了torch可以调用GPU。之后安装anaconda,并配置/root/anaconda的环境变量,之后创建虚拟环境wyq。…

性能优化与资源管理:优化Selenium脚本的执行效率,合理管理浏览器实例和系统资源

目录 引言 一、Selenium基础与常用方法 1.1 Selenium简介 1.2 Selenium基础用法 二、Selenium性能优化技巧 2.1 使用WebDriverWait实现显式等待 2.2 启用无头模式 2.3 设置合理的页面加载策略 2.4 禁用图片和JavaScript加载 2.5 优化元素定位 2.6 合理使用隐式等待和…

《经典图论算法》约翰逊算法(Johnson)

摘要: 1,约翰逊算法的介绍 2,约翰逊算法的实现步骤 3,约翰逊算法的准确性验证 4,约翰逊算法的代码实现 1,约翰逊算法的介绍 约翰逊算法(Johnson algorithm)是在稀疏图上求每对顶点之间最短路径的一种算法&a…

EchartJs报表展示

EchartJs报表展示 1、Echarts介绍 我们当前项目下的图形报表是使用echarts实现,所以接下来我们学习下echart的基本使用。 echarts Apache官网:https://echarts.apache.org/zh/index.html 点击所有示例,可快速学习echarts的基本使用&#x…

2024 大厂 Java 面试题汇总,作为 Java 程序员必须要掌握的技术栈

面试就是大家身边总是存在各种各样的可能,而自身又具备这样的能力,就忍不住想试一试,尤其是到了年关,是一个好的蓄势并且认真积累的阶段。当然面试套路众多,但对于技术面试来说,主要是考察一个人的技术能力和沟通能力。不同类型的…

一文了解智能无感知验证码

在数字化浪潮中,验证码作为守护信息安全的第一道关卡,其重要性日益凸显。它不仅用于识别真实用户与机器程序,更是防范网络攻击、保障数据安全的关键手段。本文将深入探讨验证码的定义、作用、分类,并重点介绍智能无感知验证码这一…