Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容


Posted in Python onFebruary 23, 2018

1、引言

在Python网络爬虫内容提取器一文我们详细讲解了核心部件:可插拔的内容提取器类gsExtractor。本文记录了确定gsExtractor的技术路线过程中所做的编程实验。这是第二部分,第一部分实验了用xslt方式一次性提取静态网页内容并转换成xml格式。留下了一个问题:javascript管理的动态内容怎样提取?那么本文就回答这个问题。

2、提取动态内容的技术部件

在上一篇python使用xslt提取网页数据中,要提取的内容是直接从网页的source code里拿到的。但是一些Ajax动态内容是在source code找不到的,就要找合适的程序库把异步或动态加载的内容加载上来,交给本项目的提取器进行提取。

python可以使用selenium执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。selenium自己不带浏览器,可以使用第三方浏览器如Firefox,Chrome等,也可以使用headless浏览器如PhantomJS在后台执行。

3、源代码和实验过程

假如我们要抓取京东手机页面的手机名称和价格(价格在网页源码是找不到的),如下图:

Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容

第一步:利用集搜客谋数台的直观标注功能,可以极快速度自动生成一个调试好的抓取规则,其实是一个标准的xslt程序,如下图,把生成的xslt程序拷贝到下面的程序中即可。注意:本文只是记录实验过程,实际系统中,将采用多种方式把xslt程序注入到内容提取器重。

Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容

第二步:执行如下代码(在windows10, python3.2下测试通过,源代码下载地址请见文章末尾GitHub),请注意:xslt是一个比较长的字符串,如果删除这个字符串,代码没有几行,足以见得Python之强大

#/usr/bin/python 
from urllib import request 
from lxml import etree 
from selenium import webdriver 
import time 
 
# 京东手机商品页面 
url = "http://item.jd.com/1312640.html" 
 
# 下面的xslt是通过集搜客的谋数台图形界面自动生成的 
xslt_root = etree.XML("""\ 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
<xsl:template match="/"> 
<商品> 
<xsl:apply-templates select="//*[@id='itemInfo' and count(.//*[@id='summary-price']/div[position()=2]/strong/text())>0 and count(.//*[@id='name']/h1/text())>0]" mode="商品"/> 
</商品> 
</xsl:template> 
 
<xsl:template match="//*[@id='itemInfo' and count(.//*[@id='summary-price']/div[position()=2]/strong/text())>0 and count(.//*[@id='name']/h1/text())>0]" mode="商品"> 
<item> 
<价格> 
<xsl:value-of select="*//*[@id='summary-price']/div[position()=2]/strong/text()"/> 
<xsl:value-of select="*[@id='summary-price']/div[position()=2]/strong/text()"/> 
<xsl:if test="@id='summary-price'"> 
<xsl:value-of select="div[position()=2]/strong/text()"/> 
</xsl:if> 
</价格> 
<名称> 
<xsl:value-of select="*//*[@id='name']/h1/text()"/> 
<xsl:value-of select="*[@id='name']/h1/text()"/> 
<xsl:if test="@id='name'"> 
<xsl:value-of select="h1/text()"/> 
</xsl:if> 
</名称> 
</item> 
</xsl:template> 
</xsl:stylesheet>""") 
 
# 使用webdriver.PhantomJS 
browser = webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe') 
browser.get(url) 
time.sleep(3) 
 
transform = etree.XSLT(xslt_root) 
 
# 执行js得到整个dom 
html = browser.execute_script("return document.documentElement.outerHTML") 
doc = etree.HTML(html) 
# 用xslt从dom中提取需要的字段 
result_tree = transform(doc) 
print(result_tree)

第三步:下图可以看到,网页中的手机名称和价格被正确抓取下来了

Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容

4、接下来阅读

至此,我们通过两篇文章演示怎样抓取静态和动态网页内容,都采用了xslt一次性将需要的内容从网页上提取出来,其实xslt是一个比较复杂的程序语言,如果手工编写xslt,那么还不如写成离散的xpath。如果这个xslt不是手工写出来的,而是程序自动生成的,这就有意义了,程序员再也不要花时间编写和调测抓取规则了,这是很费时费力的工作。下一篇《1分钟快速生成用于网页内容提取的xslt》将讲述怎样生成xslt。

5、集搜客GooSeeker开源代码下载源

1. GooSeeker开源Python网络爬虫GitHub源

6、文档修改历史

2016-05-26:V2.0,增补文字说明
2016-05-29:V2.1,增加第五章:源代码下载源,并更换github源的网址

Python 相关文章推荐
Python中声明只包含一个元素的元组数据方法
Aug 25 Python
Python判断操作系统类型代码分享
Nov 22 Python
Python实现从脚本里运行scrapy的方法
Apr 07 Python
对Python中的@classmethod用法详解
Apr 21 Python
python实现俄罗斯方块
Jun 26 Python
Python自动化运维之Ansible定义主机与组规则操作详解
Jun 13 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
Aug 28 Python
Python笔记之代理模式
Nov 20 Python
Python OpenCV读取显示视频的方法示例
Feb 20 Python
解决jupyter notebook 前面书写后面内容消失的问题
Apr 13 Python
使用python实现时间序列白噪声检验方式
Jun 03 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
Jun 18 Python
python爬虫获取多页天涯帖子
Feb 23 #Python
Python即时网络爬虫项目启动说明详解
Feb 23 #Python
Python爬豆瓣电影实例
Feb 23 #Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
Feb 23 #Python
Python各类图像库的图片读写方式总结(推荐)
Feb 23 #Python
python自动发邮件库yagmail的示例代码
Feb 23 #Python
Python KMeans聚类问题分析
Feb 23 #Python
You might like
php Mysql日期和时间函数集合
2007/11/16 PHP
js 上传图片预览问题
2010/12/06 Javascript
textarea 控制输入字符字节数(示例代码)
2013/12/27 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
jQuery图片切换动画特效
2016/11/02 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
2016/11/15 Javascript
Node+Express+MongoDB实现登录注册功能实例
2017/04/23 Javascript
浅谈Node模块系统及其模式
2017/11/17 Javascript
Electron中实现大文件上传和断点续传功能
2018/10/28 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
2019/06/26 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
python调用fortran模块
2016/04/08 Python
python设计模式大全
2016/06/27 Python
Python ldap实现登录实例代码
2016/09/30 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
用vue.js组件模拟v-model指令实例方法
2019/07/05 Python
python json.dumps中文乱码问题解决
2020/04/01 Python
Keras在训练期间可视化训练误差和测试误差实例
2020/06/16 Python
Python读取Excel一列并计算所有对象出现次数的方法
2020/09/04 Python
采用冷却技术的超自然舒适度:GhostBed床垫
2018/09/18 全球购物
斐乐美国官方网站:FILA美国
2019/03/01 全球购物
Rhone官方网站:男士运动服装、健身服装和高级运动服
2019/05/01 全球购物
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
经典优秀个人求职自荐信格式
2013/09/25 职场文书
火车的故事教学反思
2014/02/11 职场文书
电气工程及其自动化专业求职信
2014/06/23 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书
2014年房产销售工作总结
2014/12/08 职场文书
端午节活动总结报告
2015/02/11 职场文书
Python Pandas pandas.read_sql函数实例用法
2021/06/21 Python
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python