iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Javascript动态生成的页面信息爬
  • 206
分享到

Javascript动态生成的页面信息爬

页面动态信息 2023-01-30 23:01:03 206人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

  最近,笔者在使用Requests模拟浏览器发送Post请求时,发现程序返回的html与浏览器F12观察到的略有不同,经过观察返回的response.text,cookies确认有效,因为我们可以看到返回的登陆信息。然而部分字段的值依然

  最近,笔者在使用Requests模拟浏览器发送Post请求时,发现程序返回的html与浏览器F12观察到的略有不同,经过观察返回的response.text,cookies确认有效,因为我们可以看到返回的登陆信息。然而部分字段的值依然显示为空。

下图是浏览器F12抓包看到的界面:

由于笔者在查看第一个接口请求时,观察浏览器捕获到的Response(html文件)跟页面展示的信息一致,就单纯以为只要用requests库构造这个请求即可。然而实际上第一个表单只是返回了前台页面的框架,很多数据都是通过script、XHR等格式的请求返回数据后,再动态加载到基础框架页面的。

那么直接挑重点,请求下面关键的list.do等xhr信息可以吗?

  此例中是不可以的,整个前台网页的内容填充是分模块的,后台每个js文件或者JSON返回都只决定了页面的一部分信息,这就导致要完整获得页面的信息就需要模拟多个请求。更关键的是,前端页面的部分信息是结合后台的返回的json文件经过一定规律的运算后,才返回的最终结果。如果不能定位到页面中的值后台的运算函数,我们无法模拟后台服务器行为构造同样的函数。

这种靠多个JavaScript文件渲染后生成的网页,直接用requests库来爬取就显得难度较大。

此时通过查阅资料,发现有两种方法来解决javascript动态生成页面信息的爬取:(参考博客:https://www.cnblogs.com/taolusi/p/9282565.html

1.1 用dryscrape库动态抓取页面

  js脚本是通过浏览器来执行并返回信息的,所以,抓取js执行后的页面,一个最直接的方式就是用python模拟浏览器的行为。WEBKit 是一个开源的浏览器引擎,Python提供了许多库可以调用这个引擎,dryscrape便是其中之一,它调用webkit引擎来处理包含js等的网页!ps:该方法由于其底层操作逻辑(python调用 webkit请求页面,而且等页面加载完,载入js文件,让js执行,将执行后的页面返回),导致实际过程偏慢。

import dryscrape
# 使用dryscrape库 动态抓取页面
def get_url_dynamic(url):
    session_req=dryscrape.Session()
    session_req.visit(url) #请求页面
    response=session_req.body() #网页的文本
    #print(response)
    return response
get_text_line(get_url_dynamic(url)) #将输出一条文本

1.2 使用selenium来完成动态页面的爬取

selenium是一个web测试框架,它允许调用本地的浏览器引擎发送网页请求,所以,它同样可以实现抓取页面的要求。

这也是笔者之前大部分文章中推荐的的框架,所谓“可见即可爬”,只可惜效率较requests后台请求的方式,依旧要慢不少。如果能结合Chrome浏览器的headless模式,静默爬取,则能稍微提升一点效率。开启headless模式代码示例:

from selenium import webdriver
option = webdriver.ChromeOptions()
option.add_argument('headless')
driver = webdriver.Chrome(chrome_options=option)
driver.get(url) #访问网址
page_content=driver.page_source #获取js选然后的页面源码

经过上诉操作后,我们就可以拿到页面最终的源码。

但是实际使用中,selenium还有一个问题,就是“可见方可爬”,有些在源码中明明能看到的页面元素,如果前台显示页面,需要点击才会出现,则我们也要模拟浏览器行为,利用click()方法,点击才能拿到相关节点的数据。如:

假如页面停留在“基础信息”界面,如果想取到“审批信息”tab页的信息,则需要模拟点击“审批信息”,这多少会降低爬取效率。

  此时,建议直接用BeautifulSoup包来解析html文件,再配合万能的正则表达式RE直接取,不到迫不得已尽量不去模拟浏览器点击行为(除非页面源码中没有,需要点击触发js动态返回信息的情况)。

下面是我实际工作中结合源码和bs4(BeautifulSoup),re表达式来爬取特定字段的示例:

whole_text=driver.page_source   #提取加载后的源码
soup=BeautifulSoup(whole_text,"lxml")                  
haf=str(soup.select('script')[6])   #得到haf字段,再进行后续提取
flowHiComments=re.search('.*?flowHiComments\":(.*?),\"flowHinodeIds.*?',haf,re.S)
applyerId=soup.find(id="afPersonId")['value']   #根据id查找 
applyerName=re.search('.*?applyerName\":\"(.*?)\".*?',haf,re.S).group(1) #根据re表达式的group方法提取字符串特定字段
flowHiComments=json.loads(flowHiComments.group(1))  #得到页面评论信息  
with open('.\\CommentFlow\\%s_%s.txt'%(bpmDefName,afFORMNumber),'w',encoding="utf-8") as txt:   #将flowHiComments保存为本地txt文件,并对文件进行格式化
    json.dump(flowHiComments,txt,ensure_ascii = False,indent=4)

当拿到特定字段后,就需要逐条对信息进行存储,譬如将信息保存同本地excel文件,这时要用到openpyxl文件。

openpyxl文件对excel新格式的支持比较友好,实际使用中依旧有些地方需要注意:

1.openpyxl默认提供返回excel最后一行(列)的索引号:

利用ws.mas_row和  ws.max_column 两个原生方法即可,但是倘若我们想要读到任意一列的最后一行行号呢?ws.max_row就显得不那么灵活了。

如果要取到A列所有元素到内存,则可以使用的示例代码如下:

name=[]
while True: if sheet.cell(num,1).value ==None: break name.append(sheet.cell(num,1).value) #名称 num+=1

B列的取值,同理可得。

2.我们习惯用ws.append()方法按照行来追加数据到表格中,实测,每次内容追加都是从第二行开始(是否考虑第一行为标题行),倘若我们希望程序执行时动态添加标题行呢?

笔者实测了下:

from openpyxl import load_workbook
wb= load_workbook('test2.xlsx')
#wb.active =1
sheet=wb["Sheet1"]
row = [1 ,2, 3, 4, 5]
sheet.append(row)

wb.save('test2.xlsx')

结果执行完后excel端生成的数据是从第二行开始的:

这显然有时无法满足我们的要求,关于第一行如果要传值就不建议使用原生的append方法了,可行的建议如下:

        
navigation=[]
if ws.cell(1,1).value ==None: navigation=["名称","单号","业务描述","申请者","申请者编号","代码","备注"] for m in range(len(navigation)): ws.cell(1,m+1).value=navigation[m]

上述代码中的navigation列表每个元素当然也能传入爬虫捕获到的字段值(变量),非常灵活!

  爬虫过程中总是遇到这样那样的问题,归纳和总结加上前人积累的经验 就显得尤为重要,避免重复踩坑!

 

--结束END--

本文标题: Javascript动态生成的页面信息爬

本文链接: https://www.lsjlt.com/news/180453.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Javascript动态生成的页面信息爬
      最近,笔者在使用Requests模拟浏览器发送Post请求时,发现程序返回的html与浏览器F12观察到的略有不同,经过观察返回的response.text,cookies确认有效,因为我们可以看到返回的登陆信息。然而部分字段的值依然...
    99+
    2023-01-30
    页面 动态 信息
  • Python 基于Selenium实现动态网页信息的爬取
    目录一、Selenium介绍与配置1.Selenium简介2. Selenium+Python环境配置二、网页自动化测试1.启动浏览器并打开百度搜索2.定位元素三、爬取动态网页的名人...
    99+
    2024-04-02
  • Python基于Selenium怎么实现动态网页信息的爬取
    这篇文章主要介绍“Python基于Selenium怎么实现动态网页信息的爬取”,在日常操作中,相信很多人在Python基于Selenium怎么实现动态网页信息的爬取问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答...
    99+
    2023-06-22
  • JS如何自动生成动态HTML验证码页面
    这篇文章主要为大家展示了“JS如何自动生成动态HTML验证码页面”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS如何自动生成动态HTML验证码页面”这篇文章吧...
    99+
    2024-04-02
  • angularJS动态生成的页面中ng-click无效怎么办
    这篇文章将为大家详细讲解有关angularJS动态生成的页面中ng-click无效怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.首先将我们要赋值给页面的数据ne...
    99+
    2024-04-02
  • javascript如何生成动态表格
    本文小编为大家详细介绍“javascript如何生成动态表格”,内容详细,步骤清晰,细节处理妥当,希望这篇“javascript如何生成动态表格”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。案例分析因为里面的学生...
    99+
    2023-06-29
  • javascript动态生成表格详解
    *创建一个页面:两个输入框和一个按钮 *代码和步骤 代码如下: <html > <head> <title>动态生成表格<...
    99+
    2024-04-02
  • 使用selenium+chromedriver+xpath爬取动态加载信息
    目录安装selenium模块说 明selenium模块的使用selenium 模块的常用方法总 结使用selenium实现动态渲染页面的爬取,selenium是浏览器自动化测试框架,...
    99+
    2024-04-02
  • Selenium&Chrome实战:动态爬取51job招聘信息
    Selenium3.8版本以后,已经不支持PhanTomJS了,可以使用谷歌,火狐的无头浏览器来代替PhanTomJS使用chrome的无头浏览器,需要下载谷歌驱动chromedriver.exechromedriver.exe下载 &nb...
    99+
    2023-01-30
    招聘信息 实战 动态
  • javascript怎么实现页面生成器
    这篇文章主要介绍“javascript怎么实现页面生成器”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“javascript怎么实现页面生成器”文章能帮助大家解决问题。目标我们的目标是实现一个页面制作...
    99+
    2023-06-27
  • ASP.NET中怎么生成HTML静态页面
    ASP.NET中怎么生成HTML静态页面,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。ASP.NET模版生成HTML静态页面方案1:/// <&...
    99+
    2023-06-17
  • javascript如何动态生成css代码
    这篇文章主要为大家展示了“javascript如何动态生成css代码”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript如何动态生成css代码”这...
    99+
    2024-04-02
  • VB.NET如何生成静态页面和分页原理
    这篇文章主要为大家展示了“VB.NET如何生成静态页面和分页原理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“VB.NET如何生成静态页面和分页原理”这篇文章吧。1、VB.NET生成静态页面和分...
    99+
    2023-06-17
  • 如何使用PHP生成动态网页
    PHP是一种广泛应用于网页开发的脚本语言,可以与HTML结合使用,通过动态生成网页内容,提供更加丰富和个性化的用户体验。本文将介绍如何使用PHP生成动态网页,并提供具体的代码示例。第一步:设置PHP开发环境在开始编写PHP代码之前,需要确保...
    99+
    2023-10-21
    PHP动态网页 PHP生成网页 PHP网页编程
  • webpack如何自动生成html页面
    这篇文章主要为大家展示了“webpack如何自动生成html页面”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“webpack如何自动生成html页面”这篇文章吧...
    99+
    2024-04-02
  • JavaScript如何实现动态生成表格
    这篇文章给大家分享的是有关JavaScript如何实现动态生成表格的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言在这里实现一个动态添加表格的案例,当点击添加按钮时,可以弹出一个表单,然后将输入的内容添加到表格...
    99+
    2023-06-22
  • 如何使用selenium+chromedriver+xpath爬取动态加载信息
    这篇文章主要介绍如何使用selenium+chromedriver+xpath爬取动态加载信息,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用selenium实现动态渲染页面的爬取,selenium是浏览器自动化测...
    99+
    2023-06-29
  • JavaScript怎么实现生成动态表格和动态效果
    本篇内容介绍了“JavaScript怎么实现生成动态表格和动态效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!代码:<!DOCTYP...
    99+
    2023-06-29
  • Java使用Freemarker页面静态化生成的实现
    目录前言:1、 Freemarker介绍2、创建模板文件3、生成文件4、 Freemarker指令4.1、assign指令4.2、include指令4.3、if指令4.4、list指...
    99+
    2024-04-02
  • Android使用代码动态生成界面
    我们最常用使用XML来编写Android应用程序的UI,这样的好处是方便快捷可视化,而且维护和修改特别容易,但是它是静态的。如果我们要做的程序的界面是固定的,用XML固然是最好的选择...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作