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中让MySQL查询结果返回字典类型的方法
Aug 22 Python
python从入门到精通(DAY 1)
Dec 20 Python
Python随手笔记第一篇(2)之初识列表和元组
Jan 23 Python
配置 Pycharm 默认 Test runner 的图文教程
Nov 30 Python
详解python中的线程与线程池
May 10 Python
Python编程学习之如何判断3个数的大小
Aug 07 Python
基于python实现语音录入识别代码实例
Jan 17 Python
Django 项目布局方法(值得推荐)
Mar 22 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
Jun 02 Python
keras实现theano和tensorflow训练的模型相互转换
Jun 19 Python
python编写五子棋游戏
May 25 Python
Python开发简易五子棋小游戏
May 02 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 xml文件操作代码(一)
2009/03/20 PHP
解析PHP生成静态html文件的三种方法
2013/06/18 PHP
PHP设计模式之组合模式定义与应用示例
2020/02/01 PHP
jQuery 在光标定位的地方插入文字的插件
2012/05/10 Javascript
js事件源window.event.srcElement兼容性写法(详解)
2016/11/25 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
2020/03/28 Javascript
angular或者js怎么确定选中ul中的哪几个li
2017/08/16 Javascript
ReactNative中使用Redux架构总结
2017/12/15 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
vue微信分享的实现(在当前页面分享其他页面)
2019/04/16 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
[00:48]DOTA2国际邀请赛公开赛报名开始 扫码开启逐梦之旅
2018/06/06 DOTA
python和C语言混合编程实例
2014/06/04 Python
如何将python中的List转化成dictionary
2016/08/15 Python
python中reload(module)的用法示例详解
2017/09/15 Python
python3+dlib实现人脸识别和情绪分析
2018/04/21 Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
2019/10/25 Python
详解python中docx库的安装过程
2019/11/08 Python
python爬虫可以爬什么
2020/06/16 Python
python语言time库和datetime库基本使用详解
2020/12/25 Python
CSS实现的一闪而过的图片闪光效果
2014/04/23 HTML / CSS
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
瑞典廉价机票预订网站:Seat24
2018/06/19 全球购物
西班牙手机之家:Phone House
2018/10/18 全球购物
为什么会有内存对齐
2016/10/10 面试题
什么是组件架构
2016/05/15 面试题
有模特经验的简历自我评价
2013/09/19 职场文书
销售行业个人求职自荐信
2013/09/25 职场文书
高中生学习的自我评价
2013/12/14 职场文书
优秀的茶餐厅创业计划书
2014/01/03 职场文书
商场中秋节广播稿
2014/01/17 职场文书
《故乡》教学反思
2014/04/10 职场文书
企业党员岗位承诺书
2015/04/27 职场文书
卡特教练观后感
2015/06/08 职场文书
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers