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编写爬虫小程序
May 14 Python
Python中内置的日志模块logging用法详解
Jul 12 Python
python使用xpath中遇到:到底是什么?
Jan 04 Python
利用Python写一个爬妹子的爬虫
Jun 08 Python
Python中.join()和os.path.join()两个函数的用法详解
Jun 11 Python
Pandas Shift函数的基础入门学习笔记
Nov 16 Python
十分钟搞定pandas(入门教程)
Jun 21 Python
详解python编译器和解释器的区别
Jun 24 Python
python3.7环境下安装Anaconda的教程图解
Sep 10 Python
tensorflow 获取checkpoint中的变量列表实例
Feb 11 Python
写一个Python脚本下载哔哩哔哩舞蹈区的所有视频
May 31 Python
Pytorch中Softmax与LogSigmoid的对比分析
Jun 05 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_xmlhttp 乱码问题解决方法
2009/08/07 PHP
php绝对路径与相对路径之间关系的的分析
2010/03/03 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
2017/02/07 PHP
Laravel学习基础之migrate的使用教程
2017/10/11 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
jquery在IE、FF浏览器的差别详细探讨
2013/04/28 Javascript
iframe子父页面调用js函数示例
2013/11/07 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
node.js中的fs.lchown方法使用说明
2014/12/16 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
2015/03/04 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
js表单登陆验证示例
2016/10/19 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
js+html制作简单验证码
2017/02/16 Javascript
js css3实现图片拖拽效果
2017/03/04 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
详解操作虚拟dom模拟react视图渲染
2018/07/25 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
VUE基于NUXT的SSR 服务端渲染
2018/11/30 Javascript
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
python基础教程之元组操作使用详解
2014/03/25 Python
收集的几个Python小技巧分享
2014/11/22 Python
python 梯度法求解函数极值的实例
2019/07/10 Python
Python如何对XML 解析
2020/06/28 Python
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
升职自荐书范文
2013/11/28 职场文书
医院院务公开实施方案
2014/05/03 职场文书
乔丹名人堂演讲稿
2014/05/24 职场文书
中职生求职信
2014/07/01 职场文书
党的群众路线教育实践活动批评与自我批评范文
2014/10/16 职场文书
linux下安装redis图文详细步骤
2021/12/04 Redis
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS
Python利用FlashText算法实现替换字符串
2022/03/31 Python