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,源代码和实验过程假如我们要抓取京东手机页面的手机名称和价格(价格在网页源码是找不到的),如下图:
第二步:执行如下代码(在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(“””\
“””)
# 使用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)
第三步:下图可以看到,网页中的手机名称和价格被正确抓取下来了