在上一篇python使用xslt提取网页数据中,要提取的内容是直接从网页的sourceco"/>

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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容相关的知识,希望对你有一定的参考价值。

技术分享

在上一篇python使用xslt提取网页数据中,要提取的内容是直接从网页的source code里拿到的。

但是对于一些Ajax或动态html, 很多时候要提取的内容是在source code找不到的,这种情况就要想办法把异步或动态加载的内容提取出来。

python中可以使用
selenium执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。
selenium自己不带浏览器,可以使用第三方浏览器如Firefox, Chrome等,也可以使用headless浏览器如
PhantomJS在后台执行。

例如我们要抓取
京东手机页面的手机名称和价格(价格在网页源码是找不到的)

技术分享 

第一步:在集搜客谋数台上,通过图形界面快速的生成xslt

技术分享 

第二步:执行如下代码(在windows10, python3.2下测试通过);

#/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)


第三步:可以看到,网页中的手机名称和价格被正确抓取下来了。

技术分享 


本文出自 “fullerhua的博客” 博客,谢绝转载!

以上是关于Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫积累--------selenium+python+PhantomJS的使用

Python爬虫学习:Selenium的使用

[Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)

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

python爬虫从入门到放弃之 Selenium库的使用

python爬虫之Selenium