> 백엔드 개발 > 파이썬 튜토리얼 > Python 크롤러는 Selenium+PhantomJS를 사용하여 Ajax 및 동적 HTML 콘텐츠를 크롤링합니다.

Python 크롤러는 Selenium+PhantomJS를 사용하여 Ajax 및 동적 HTML 콘텐츠를 크롤링합니다.

高洛峰
풀어 주다: 2016-11-22 16:49:12
원래의
1643명이 탐색했습니다.

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下测试通过),请注意: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=&#39;itemInfo&#39; and count(.//*[@id=&#39;summary-price&#39;]/div[position()=2]/strong/text())>0 and count(.//*[@id=&#39;name&#39;]/h1/text())>0]" mode="商品"/>
</商品>
</xsl:template>

<xsl:template match="//*[@id=&#39;itemInfo&#39; and count(.//*[@id=&#39;summary-price&#39;]/div[position()=2]/strong/text())>0 and count(.//*[@id=&#39;name&#39;]/h1/text())>0]" mode="商品">
<item>
<价格>
<xsl:value-of select="*//*[@id=&#39;summary-price&#39;]/div[position()=2]/strong/text()"/>
<xsl:value-of select="*[@id=&#39;summary-price&#39;]/div[position()=2]/strong/text()"/>
<xsl:if test="@id=&#39;summary-price&#39;">
<xsl:value-of select="div[position()=2]/strong/text()"/>
</xsl:if>
</价格>
<名称>
<xsl:value-of select="*//*[@id=&#39;name&#39;]/h1/text()"/>
<xsl:value-of select="*[@id=&#39;name&#39;]/h1/text()"/>
<xsl:if test="@id=&#39;name&#39;">
<xsl:value-of select="h1/text()"/>
</xsl:if>
</名称>
</item>
</xsl:template>
</xsl:stylesheet>""")

# 使用webdriver.PhantomJS
browser = webdriver.PhantomJS(executable_path=&#39;C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe&#39;)
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 콘텐츠를 크롤링합니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿