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编程培训 python培训靠谱吗
Jan 17 Python
python验证码识别实例代码
Feb 03 Python
Python测试人员需要掌握的知识
Feb 08 Python
python的内存管理和垃圾回收机制详解
May 18 Python
python开头的coding设置方法
Aug 08 Python
pytorch中的embedding词向量的使用方法
Aug 18 Python
python连接PostgreSQL数据库的过程详解
Sep 18 Python
python groupby 函数 as_index详解
Dec 16 Python
Python通过文本和图片生成词云图
May 21 Python
Python3爬虫mitmproxy的安装步骤
Jul 29 Python
Python SQLAlchemy库的使用方法
Oct 13 Python
Python和Bash结合在一起的方法
Nov 13 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
论建造顺序的重要性
2020/03/04 星际争霸
PHP 微信支付类 demo
2015/11/30 PHP
非常漂亮的JS代码经典广告
2007/10/21 Javascript
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
2011/01/17 Javascript
firebug的一个有趣现象介绍
2011/11/30 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2013/10/24 Javascript
jQuery判断checkbox是否选中的3种方法
2014/08/12 Javascript
从JQuery源码分析JavaScript函数的apply方法与call方法
2014/09/25 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
2015/12/20 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
使用jquery.qrcode.min.js实现中文转化二维码
2016/03/11 Javascript
react-router v4如何使用history控制路由跳转详解
2018/01/09 Javascript
vue首次赋值不触发watch的解决方法
2018/09/11 Javascript
ES6基础之默认参数值
2019/02/21 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
2019/05/23 Javascript
vue实现的上拉加载更多数据/分页功能示例
2019/05/25 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
2020/03/16 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
Python实现冒泡排序的简单应用示例
2017/12/11 Python
对python中list的五种查找方法说明
2020/07/13 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
2020/08/07 Python
python 对xml解析的示例
2021/02/27 Python
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
快时尚眼镜品牌,全国连锁眼镜店:LOHO眼镜生活
2018/10/08 全球购物
通息工程毕业生自荐信
2013/10/16 职场文书
分公司经理岗位职责
2013/11/11 职场文书
服装创业计划书范文
2014/02/05 职场文书
小露珠教学反思
2014/04/30 职场文书
党员四风剖析材料
2014/08/27 职场文书
警察群众路线整改措施
2014/09/26 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
2014年派出所工作总结
2014/11/21 职场文书
导游词之西安骊山
2019/12/20 职场文书
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python
在windows server 2012 r2中安装mysql的详细步骤
2022/07/23 Servers