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

您所在的位置:网站首页 mep是什么软件 Python下利用Selenium获取动态页面数据

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

2023-03-20 15:15| 来源: 网络整理| 查看: 265

利用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模拟浏览器进行点击,点击“下一页”后页面数据进行更新,获取更新后的页面数据即可。下面是完整代码:

# -*- coding:utf-8 -*-   import requests   from bs4 import BeautifulSoup   import json   import time   from selenium import webdriver   import sys   reload(sys)   sys.setdefaultencoding( "utf-8" )   curpath=sys.path[0]   print curpath   def getData(url):    # 使用下载好的phantomjs,网上也有人用firefox,chrome,但是我没有成功,用这个也挺方便   driver =webdriver.PhantomJS(executable_path="C:/phantomjs.exe")   driver.set_page_load_timeout(30)   time.sleep(3)   html=driver.get(url[0]) # 使用get方法请求url,因为是模拟浏览器,所以不需要headers信息   for page in range(3):   html=driver.page_source # 获取网页的html数据   soup=BeautifulSoup(html,'lxml') # 对html进行解析,如果提示lxml未安装,直接pip install lxml即可   table=soup.find('table',class_="report-table")   name=[]   for th in table.find_all('tr')[0].find_all('th'):   name.append(th.get_text()) # 获取表格的字段名称作为字典的键   flag=0 # 标记,当爬取字段数据是为0,否则为1   for tr in table.find_all('tr'):   # 第一行为表格字段数据,因此跳过第一行   if flag==1:   dic={}   i=0   for td in tr.find_all('td'):   dic[name[i]]=td.get_text()   i+=1   jsonDump(dic,url[1])#保存数据   flag=1    # 利用find_element_by_link_text方法得到下一页所在的位置并点击,点击后页面会自动更新,只需要重新获取driver.page_source即可   driver.find_element_by_link_text(u"下一页").click()      def jsonDump(_json,name):   """store json data"""   with open(curpath+'/'+name+'.json','a') as outfile:   json.dump(_json,outfile,ensure_ascii=False)   with open(curpath+'/'+name+'.json','a') as outfile:   outfile.write(',\n')   if __name__ == '__main__':   url=['http://datacenter.mep.gov.cn:8099/ths-report/report!list.action?xmlname=1465594312346','yzc'] # yzc为文件名,此处输入中文会报错,前面加u也不行,只好保存后手动改文件名……   getData(url) # 调用函数

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

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

 学习安排上

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

视频文档获取方式:

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

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3