python使用spynner抓取动态页面数据

http://www.comingcode.com/?p=275


20140713143658_23338

    这篇文章是我最近一直想完成的一篇文章,因为之前做的爬虫只能爬取静态页面的数据,但是现在这个时代,大部分的web页面都是动态的,经常逛的网站例如京东、淘宝等,商品列表都是js获取到后台数据后再组合成html展示出来的,单纯获取页面数据回来,而没有执行到js的话是无法看到商品数据列表信息的,这个可以通过两步来验证:在页面上右键查看源代码,和右键审查元素所看到的html代码是不一样的,如果后者中能看到商品数据信息,而前者没有的话,就说明这个页面是动态生成的。

    以前在做爬虫的时候也找到了其他的方案,例如网上说到的使用selenium来完成js的解析,简单来说,selenium其实就是通过调用本地的浏览器来完成js的解析,然后通过selenium服务问浏览器拿解析完成后的html代码。这个方案的效率比较低,并且依赖于本地的浏览器。

    昨天上网找的时候,网络上的一个说法是使用spynner来实现,并且看起来还是挺稳定的样子。spynner主要是对pyqt的webkit封装,能够完成页面的js解析,并获取到解析完成后的html代码。

    而对于html的解析就使用到了BeautifulSoup这个库,这是一个专门解析html的库,使用起来也是挺方便的。


    下面开始说一下本文抓取动态页面数据的相关工具和库:

    1. python 2.7

    2. pyqt

    3. spynner (在安装过程中,其他的一些依赖库也会自动上网下载安装)

    4. BeautifulSoup

    5. ide工具是pycharm(当然这个只是个人喜好,也可以使用其他的ide工具)

    

    以上几个工具都可以百度找到,python现在出了3.x版本的,但是由于众多第三方库或架构都没有兼容,并且后续要使用到的爬虫框架scrapy也是没有支持3.x版本,因此还是建议使用2.7版本吧。

    spynner和BeautifulSoup下载后,都可以cd到解压出来的目录,然后使用python setup.py install来完成安装,需要注意的是spynner依赖pyqt,所以一定要安装pyqt,否则无法使用spynner。


    下面使用一个具体是例子来说明一下spynner和BeautifulSoup的使用,我们就以爬取京东页面上的一些产品数据来说明如何爬取动态页面数据(当然,如果我们过于频繁的爬京东,估计还是有可能被京东将我们ip拉黑的)。

    我们爬取京东中“笔记本”页面的信息,url地址为http://list.jd.com/list.html?cat=670,671,672

    下面是具体代码

    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#ecoding: utf-8
 
import spynner
import pyquery
import time
import BeautifulSoup
 
browser  = spynner.Browser()
browser.create_webview()
browser.set_html_parser(pyquery.PyQuery)
browser.load( "http://list.jd.com/list.html?cat=670,671,672" 20 )
 
try :
     browser.wait_load( 10 )
except :
     pass
 
string  = browser.html
browser.close()
 
soup  = BeautifulSoup.BeautifulSoup(string)
time.sleep( 2 )
 
tags1  = soup.findAll( 'div' , { 'class' 'lh-wrap' })
 
for tag  in tags1:
     print tag.contents[ 2 ].contents[ 1 ][ 'id' ], tag.contents[ 2 ].contents[ 0 ].text,  "  " , tag.contents[ 1 ].contents[ 0 ].contents[ 0 ]

     上面的代码都不负责,基本的流程是创建一个browser,打开指定url,等待加载完成后,读取browser中的html进行解析,然后获取指定div节点列表,再通过一个for循环来遍历所有笔记本的信息并打印出来,下面再贴上一幅图:

    



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值