在上一篇python使用xslt提取网页数据中,要提取的内容是直接从网页的source code里拿到的。
但是对于一些Ajax或动态html, 很多时候要提取的内容是在source code找不到的,这种情况就要想办法把异步或动态加载的内容提取出来。
python中可以使用selenium执行javascript,selenium可以让浏览器自动加载页面,获取需要的数据。
selenium自己不带浏览器,可以使用第三方浏览器如Firefox, Chrome等,也可以使用headless浏览器如PhantomJS在后台执行。
例如我们要抓取京东手机页面的手机名称和价格(价格在网页源码是找不到的)
第二步:执行如下代码(在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)
第三步:可以看到,网页中的手机名称和价格被正确抓取下来了。
时间: 2024-10-24 07:22:36