• UID11822
  • 登录2017-03-02
  • 粉丝2
  • 关注0
  • 发帖31
  • 主页http://www.gooseeker.com/
  • 金币198枚
社区居民
原创写手
fullerhua 发布于2016-05-20 10:44
0/795

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

楼层直达
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,源代码和实验过程
假如我们要抓取京东手机页面的手机名称和价格(价格在网页源码是找不到的),如下图:

第一步:利用集搜客谋数台的直观标注功能,可以极快速度自动生成一个调试好的抓取规则,其实是一个标准的xslt程序,如下图,把生成的xslt程序拷贝到下面的程序中即可。注意:本文只是记录实验过程,实际系统中,将采用多种方式把xslt程序注入到内容提取器重。
第二步:执行如下代码(在windows10, python3.2下测试通过),请注意: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)
第三步:下图可以看到,网页中的手机名称和价格被正确抓取下来了

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源的网址
[fullerhua于2016-05-30 11:11编辑了帖子]

0人打赏
您需要登录后才可以回帖
发表回复
极贡献
技术问答
专题荟萃
程序人生
视觉设计
Android开发
iOS开发
编程语言
前端开发
后端开发
服务器架构
软件测试
运维方案
创业路上



最热文章墙

  • 68840/364   【精品推荐】200多种Android动画效果的强悍框架,太全了,不看这个,再有动画的问题,不理你了^@^

  • 38921/190   情人节福利,程序员表白的正确姿势:改几行代码就变成自己的表白了

  • 36007/0   Python爬虫:常用浏览器的useragent

  • 35820/255   【精品推荐】Android版产品级的音乐播放器源码,功能太强大了,最好的产品原型有木有?

  • 35227/145   省时省力的Android组件群来了,非常棒的原型参考

  • 27843/2   超全!整理常用的iOS第三方资源

  • 26905/71   原创表白APP,以程序员的姿势备战新年后的7夕,持续完善中!

  • 26479/142   2016抢红包软件及源码

  • 21495/30   麻省理工的一帮疯子,真的实现了随意操控万物!(绝对黑科技)

  • 21159/25   Android工程师面试题大全

  • 20907/27   2016程序员跳槽全攻略

  • 20709/9   GitHub上排名前50的iOS项目:总有一款你用得着

  • 20527/155   Android版类似UC浏览器:非常赞,产品级的源码

  • 19785/20   码魂:程序员的牛B漫画

  • 18064/10   2016年最全的Android面试考题+答案 精编版

  • 17824/3   吐槽那些程序员的搞笑牛逼注释

  • 17076/42   一个绚丽的loading动效分析与实现!

  • 16878/85   Android小而全的博客源码:非常适合全面掌握开发技巧

  • 16832/73   【持续更新中】Android福利贴(二):资料源码大放送

  • 16792/1   iOS 动画总结

  • 16036/45   惊艳的App引导页:背景图片切换加各个页面动画效果

  • 15817/23   个人收集的Android 各类功能源代码

  • 15604/10   女程序员的梦,众网友的神回复

  • 15366/5   新一代Android渠道打包工具:1000个渠道包只需要5秒

  • 15309/11   年会上现场review代码是怎么样的体验!

  • 15217/81   仿京东商城客户端Android最新版,不错的原型和学习资料

  • 14818/53   基于瀑布流的美女图片浏览App,有注释的源代码

  • 14777/23   珍藏多年的素材,灵感搜寻网站

  • 14766/101   Android带弹幕的视频播放器源码,来自大名鼎鼎的Bilibili弹幕网站

  • 14693/17   用JavaScript 来开发iOS和Android 原生应用:React Native开源框架中文版来啦

  • 14622/20   Android福利第三波【Android电子书】

  • 14179/76   【精品推荐】类似360安全卫士安Android源码:非常赞的产品原型

  • 13904/0   iOS中文版资源库,非常全

  • 13834/15   基于Android支付宝支付设计和开发方案

  • 13797/18   65条最常用正则表达式,你要的都在这里了

  • 13304/17   什么是真正的黑客:收获12200+Stars,人气远超微软开源VS

  • 12953/11   有木有这样一张酷图帮你集齐所有git命令超实用

  • 12633/7   一张图搞定iOS学习路线,非常全面

  • 12571/7   用程序员的姿势抢过年的火车票

  • 12405/46   在线音乐播放器完整版(商用级的源码):非常赞,可听免费高品质专辑

  • 12274/10   成为Java顶尖程序员 ,看这11本书就够了

  • 12096/10   微信支付终于成功了(安卓,iOS),在此分享

  • 12007/18   一张图搞定Android学习路线,非常全面

  • 11843/0   GitHub iOS 库和框架Top100 

  • 11766/3   基于Node.js的强大爬虫,能直接发布抓取的文章哦

  • 11551/61   【技巧一】搭配Android Studio,如何实现App远程真机debug?

  • 11549/29   【持续更新中】Android福利贴(一):资料源码

  • 10972/4   46 个非常有用的 PHP 代码片段

  • 10851/3   即时通信第三方库

  • 10539/8   流媒体视频直播方案

  • 10404/9   B站建开源工作组:APP想支持炫酷弹幕的看过来

  • 10380/18   八个最优秀的Android Studio插件

  • 10267/9   烧了5亿美金,这家神秘的公司即将颠覆人类未来!

  • 10075/2   【精品推荐】高质量PHP代码的50个实用技巧:非常值得收藏

  • 10057/10   中国黑客的隐秘江湖:攻守对立,顶尖高手月入千万美元

  • 9488/6   开箱即用!Android四款系统架构工具

  • 9316/10   十大技巧快速提升Android应用开发性能

  • 9259/3   10款GitHub上最火爆的国产开源项目——可以媲美西半球

  • 9217/3   一张图看清Linux 内核运行原理

  • 8999/1   Android性能优化视频,文档以及工具

  • 返回顶部