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监控网卡流量并使用graphite绘图的示例
Apr 27 Python
浅谈DataFrame和SparkSql取值误区
Jun 09 Python
详解python3中tkinter知识点
Jun 21 Python
Python使用分布式锁的代码演示示例
Jul 30 Python
Django使用模板后无法找到静态资源文件问题解决
Jul 19 Python
python super用法及原理详解
Jan 20 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
Mar 14 Python
python属于解释型语言么
Jun 15 Python
python爬虫使用scrapy注意事项
Nov 23 Python
Python 利用argparse模块实现脚本命令行参数解析
Dec 28 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 Python
Python中request的基本使用解决乱码问题
Apr 12 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
ThinkPHP 防止表单重复提交的方法
2011/08/08 PHP
php数组函数序列之array_unique() - 去除数组中重复的元素值
2011/10/29 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
PHP关于htmlspecialchars、strip_tags、addslashes的解释
2014/07/04 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
2019/07/08 PHP
Jquery uploadify图片上传插件无法上传的解决方法
2013/12/16 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
JavaScript的六种继承方式(推荐)
2017/06/26 Javascript
angular.extend方法的具体使用
2017/09/14 Javascript
微信小程序实现列表下拉刷新上拉加载
2020/07/29 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
通过JavaScript下载文件到本地的方法(单文件)
2019/03/17 Javascript
Typescript 中的 interface 和 type 到底有什么区别详解
2019/06/18 Javascript
vue + typescript + 极验登录验证的实现方法
2019/06/27 Javascript
js动态生成表格(节点操作)
2021/01/12 Javascript
python实现简单的计时器功能函数
2015/03/14 Python
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
Python 列表理解及使用方法
2017/10/27 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
Python如何基于Tesseract实现识别文字功能
2020/06/05 Python
浅谈Python中的模块
2020/06/10 Python
python dict如何定义
2020/09/02 Python
python 实现学生信息管理系统的示例
2020/11/28 Python
CSS3制作Dropdown下拉菜单的方法
2015/07/18 HTML / CSS
HTML5 标准将把互联网视频扔回到黑暗时代
2010/02/10 HTML / CSS
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
机电一体化毕业生求职信
2013/11/02 职场文书
高级护理专业毕业生推荐信
2013/12/25 职场文书
求职者怎样写自荐信
2014/04/13 职场文书
施工安全承诺书
2014/05/22 职场文书
党员干部一句话承诺
2014/05/30 职场文书
施工员岗位职责
2015/02/10 职场文书
python如何读取.mtx文件
2021/04/22 Python
Javascript设计模式之原型模式详细
2021/10/05 Javascript
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
2022/04/06 Vue.js