python下利用Selenium获取动态页面数据
2017-05-20 11:24
471 查看
利用python爬取网站数据非常便捷,效率非常高,但是常用的一般都是使用BeautifSoup、requests搭配组合抓取静态页面,即网页上显示的数据都可以在html源码中找到,而不是网站通过js或者ajax异步加载的,这种类型的网站数据爬取起来较简单。但是有些网站上的数据是通过执行js代码来更新的,这时传统的方法就不是那么适用了。这种情况下有如下几种方法:
- 清空网页上的network信息(一般来说爬取动态页面数据的都是对爬虫有一定了解的,如果你是这方面的新手,对如何分析页面和请求参数不太了解,可以参考我另一篇博客python2.7爬虫实例详细介绍之爬取大众点评的数据),更新页面,观察网页发送的请求,有些网站可以通过这种方法构造参数,从而简化爬虫。但是适用范围不够广泛。
- 适用selenium模拟浏览器行为更新网页获取更新后的数据。本文接下来着重讲述这种方法。
进行安装。另一个是PhantomJS,这是一个无界面的,可脚本编程的WebKit浏览器引擎,百度进行搜索,在其官网下进行下载,下载后无需安装,放到指定路径下,在使用时只需指定文件所在路径即可。
学习示例时请不要爬取太多页面,走一遍流程了解怎么抓就行
打开网站后,可以看到需要爬取的数据为一个规则的表格,但是有很多页。
在这个网站中,点击下一页页面的url不发生变化,是通过执行一段js代码更新页面的。因此本文思想就是利用selenium模拟浏览器进行点击,点击“下一页”后页面数据进行更新,获取更新后的页面数据即可。下面是完整代码:
本文中获取下一页的位置是通过driver.find_element_by_link_text方法来实现的,这是因为在此网页中,这个标签没有唯一可标识的id,也没有class,如果通过xpath定位的话,第一页和其他页的xpath路径又不完全相同,需要加个if进行判断。因此直接通过link的text参数进行定位。click()函数模拟在浏览器中的点击操作。如何定位页面中的元素位置,可以参考下面这篇博客。
Selenuim+Python之元素定位总结及实例说明
selenium的功能非常强大,用在爬虫上能够解决很多一般爬虫解决不了的问题,它可以模拟点击、鼠标移动,可以提交表单(应用如:登陆邮箱账号、登陆wifi等,网上有很多实例,本人暂时还没有尝试过),当你遇到一些非常规的网站数据爬取起来非常棘手时,不妨尝试一下selenium+phantomjs。
欢迎交流。
- 清空网页上的network信息(一般来说爬取动态页面数据的都是对爬虫有一定了解的,如果你是这方面的新手,对如何分析页面和请求参数不太了解,可以参考我另一篇博客python2.7爬虫实例详细介绍之爬取大众点评的数据),更新页面,观察网页发送的请求,有些网站可以通过这种方法构造参数,从而简化爬虫。但是适用范围不够广泛。
- 适用selenium模拟浏览器行为更新网页获取更新后的数据。本文接下来着重讲述这种方法。
一、准备工作
模拟浏览器需要用到两个东西,一个是python下的包selenium,可直接通过pip install selenium
进行安装。另一个是PhantomJS,这是一个无界面的,可脚本编程的WebKit浏览器引擎,百度进行搜索,在其官网下进行下载,下载后无需安装,放到指定路径下,在使用时只需指定文件所在路径即可。
二、使用selenium模拟浏览器
本文爬取网站示例为:http://datacenter.mep.gov.cn:8099/ths-report/report!list.action?xmlname=1465594312346学习示例时请不要爬取太多页面,走一遍流程了解怎么抓就行
打开网站后,可以看到需要爬取的数据为一个规则的表格,但是有很多页。
在这个网站中,点击下一页页面的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): driver =webdriver.PhantomJS(executable_path="C:/phantomjs.exe")#使用下载好的phantomjs,网上也有人用firefox,chrome,但是我没有成功,用这个也挺方便 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 driver.find_element_by_link_text(u"下一页").click()#利用find_element_by_link_text方法得到下一页所在的位置并点击,点击后页面会自动更新,只需要重新获取driver.page_source即可。 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()函数模拟在浏览器中的点击操作。如何定位页面中的元素位置,可以参考下面这篇博客。
Selenuim+Python之元素定位总结及实例说明
selenium的功能非常强大,用在爬虫上能够解决很多一般爬虫解决不了的问题,它可以模拟点击、鼠标移动,可以提交表单(应用如:登陆邮箱账号、登陆wifi等,网上有很多实例,本人暂时还没有尝试过),当你遇到一些非常规的网站数据爬取起来非常棘手时,不妨尝试一下selenium+phantomjs。
欢迎交流。
相关文章推荐
- 利用selenium获取动态页面的html数据
- python3 selenium 获取JS动态页面title
- python3 网络爬虫(二)利用get请求获取网页的动态加载数据
- Python selenium爬虫抓取船舶网站数据(动态页面)
- JS-利用ajax获取json数据,并传入页面生成动态tab
- python3 网络爬虫(三)利用post请求获取网页的动态加载数据
- Selenium学习四——利用Python爬取网页多个页面的表格数据并存到已有的excel中
- python selenium 获取动态网页数据
- Python PhatomJS 和Selenium动态加载页面 获取图片内容
- python获取动态网站上面的动态加载的数据(selenium+Firefox)
- selenium自动化测试工具开发python爬虫-动态加载页面数据获取
- 小猪的Python学习之旅 —— 5.使用Selenium抓取JavaScript动态生成数据的网页
- 利用DWR获取数据改变页面数据
- Python爬虫获取cookie:利用selenium
- Selenium学习三——利用Python爬取网页表格数据并存到excel
- asp下利用XMLHTTP 从其他页面获取数据的代码
- asp下利用XMLHTTP 从其他页面获取数据的代码
- 利用JQuery+Ajax实现aspx页面无刷新的动态数据绑定
- 利用Python从数据公司接口获取数据并输出excel格式
- python利用selenium获取cookie实现免登陆