爬虫采集-基于webkit核心的客户端Ghost.py [爬虫实例]

简介:

对与要时不时要抓取页面的我们来说,是痛苦的~

由于目前的Web开发中AJAX、Javascript、CSS的大量使用,一些网站上的重要数据是由Ajax或Javascript动态生成的,并不能直接通过解析html页面内容就能获得(例如采用urllib2,mechanize、lxml、Beautiful Soup )。要实现对这些页面数据的爬取,爬虫必须支持Javacript、DOM、HTML解析。

比如: 像监控的数据就不能用简单的curl和urllib解析到的。。。  

153204615.jpg


还有这个用ajax 渲染的页面,用urllib2直接解析不了的。

http://rfyiamcool.blog.51cto.com/blog/1030776/1287810

153356238.jpg


常见的抓数据的方法:

urllib2+urlparse+re

最原始的办法,其中urllib2是python的web库、urlparse能处理url、re是正则库,这种方法写起来比较繁琐,但也比较“实在”

urllib2+beautifulsoup

这里的得力干将是beautifulsoup,beautifulsoup可以非常有效的解析HTML页面,就可以免去自己用re去写繁琐的正则等。

Mechanize+BeautifulSoup

Mechanize是对于urllib2的部分功能的替换,使得除了http以外其他任何连接也都能被打开,也更加动态可配置

http://rfyiamcool.blog.51cto.com/blog/1030776/1287810

其实像上面的页面,要是不嫌麻烦,可以从页面狂找接口,下出来的大多是xml的格式,然后你再费劲的去解析。。。是在他折腾了。


这时候大家可以用 webkit核心的web 客户端。  他会像真正的浏览器一样来解析页面的。


WebKit: Safari, Google Chrome,傲游3 360浏览器 等等都是基于 Webkit 核心开发。

我们一般是终端取值的,这些也有不少封装好的工具

Pyv8PythonWebKitSelenium,PhantomJS,Ghost.py  等等。。。。

我这里推荐用ghost.py 。。。。 因为他够直接和实用


发现国内webkit的资料很少,ghost.py的资料就更少了,那我就根据官方的文档,简单的翻译下 ~

http://rfyiamcool.blog.51cto.com/blog/1030776/1287810

一个小例子,感受下Ghost~

1
2
3
4
from ghost  import  Ghost
ghost = Ghost()
page, extra_resources = ghost.open( "http://xiaorui.cc" )
assert page.http_status== 200  and  'xiaorui'  in  ghost.content

173049454.png

安装Ghost.py 以及相关的东东~~

用webkit,我们需要有pyqt或者是PySide

这些都安装好了后,再开始  

运气好的直接 pip install Ghost.py

运气不好的:

中间会遇到好多蛋疼的问题,大家多搜搜~

要是解决不了了,请回帖哈~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
wget http: //sourceforge.net/projects/pyqt/files/sip/sip-4.14.6/sip-4.14.6.tar.gz
tar zxvf sip- 4.14 . 6 .tar.gz
cd sip- 4.14 . 6
python configure.py
make
sudo make install
wget http: //sourceforge.net/projects/pyqt/files/PyQt4/PyQt-4.10.1/PyQt-mac-gpl-4.10.1.tar.gz
tar zxvf PyQt-mac-gpl- 4.10 . 1 .tar.gz
cd PyQt-mac-gpl- 4.10 . 1
python configure.py
make
sudo make install
wget http: //pyside.markus-ullmann.de/pyside-1.1.1-qt48-py27apple.pkg
open pyside- 1.1 . 1 -qt48-py27apple.pkg
git clone https: //github.com/mitsuhiko/flask.git
cd flask
sudo python setup.py install
git clone git: //github.com/carrerasrodrigo/Ghost.py.git
cd Ghost.py
sudo python setup.py install


创建一个实例对象:

1
2
from ghost  import  Ghost
ghost = Ghost()


打开一个页面

1
page, resources = ghost.open( 'http://my.web.page' )


夹带着 javascript代码

1
2
result, resources = ghost.evaluate(
     "document.getElementById('my-input').getAttribute('value');" )


模拟点击事件

1
2
page, resources = ghost.evaluate(
     "document.getElementById('link').click();" , expect_loading=True)



填写表单中的字段中的值 (selector, value, blur=True, expect_loading=False):

1
result, resources = ghost.set_field_value( "input[name=username]" "jeanphix" )

If you set optional parameter `blur` to False, the focus will be left on the field (usefull for autocomplete tests).

For filling file input field, simply pass file path as `value`.


你可以填写form表单     Ghost.fill(selector, values, expect_loading=False):

1
2
3
4
result, resources = ghost.fill( "form" , {
     "username" "jeanphix" ,
     "password" "mypassword"
})


提交表单~


1
page, resources = ghost.fire_on( "form" "submit" , expect_loading=True)


这是对于高级属性的定义:


173358913.png


这些有很多好用的属性

wait_for_page_loaded()

That wait until a new page is loaded.

page, resources = ghost.wait_for_page_loaded()


这个是等 页面都加载完毕,类似jquery

$(document).ready(function()


wait_for_selector(selector)

That wait until a element match the given selector.

result, resources = ghost.wait_for_selector("ul.results")


等你指定的dom名称出现


wait_for_text(text)

That wait until the given text exists inside the frame.

result, resources = ghost.wait_for_selector("My result")


等我们要的字符出现

官网出现了 FlASK 的例子:

可以通过ghost.py和unittest实现程序的单元测试:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import  unittest
from  flask  import  Flask
from  ghost  import  GhostTestCase
app  =  Flask(__name__)
@app .route( '/' )
def  home():
     return  'hello world'
class  MyTest(GhostTestCase):
     port  =  5000
     @classmethod
     def  create_app( cls ):
         return  app
     def  test_open_home( self ):
         self .ghost. open ( "http://localhost:%s/"  %  self .port)
         self .assertEqual( self .ghost.content,  'hello world' )
if  __name__  = =  '__main__' :
     unittest.main()


~~~整体的小demo~~~


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Opens the web page
ghost.open( 'http://www.openstreetmap.org/' )
# Waits  for  form search field
ghost.wait_for_selector( 'input[name=query]' )
# Fills the form
ghost.fill( "#search_form" , { 'query' 'France' })
# Submits the form
ghost.fire_on( "#search_form" "submit" )
# Waits  for  results (an XHR has been called here)
ghost.wait_for_selector(
     '#search_osm_nominatim .search_results_entry a' )
# Clicks first result link
ghost.click(
     '#search_osm_nominatim .search_results_entry:first-child a' )
# Checks  if  map has moved to expected latitude
lat, resources = ghost.evaluate( "map.center.lat" )
assert float(lat.toString()) ==  5860090.806537




aha,咱们来个实例哈~    

咱们来个简单的 模拟浏览器 到百度去搜 xiaorui.cc   然后看看内容和headers头 :

182057256.png


终端下的操作:

182759722.png


得到的是

http://www.baidu.com/s?wd=xiaorui.cc&rsv_bp=0&ch=&tn=baidu&bar=&rsv_spt=3&ie=utf-8

咱们访问下

看 他的http头

1
2
In [ 10 ]: print page.headers
{u 'BDQID' : u '0xf594a31a03344b4f' , u 'Content-Encoding' : u 'gzip' , u 'Set-Cookie' : u 'BDSVRTM=381; path=/\nH_PS_PSSID=2976_2981_3091; path=/; domain=.baidu.com' , u 'BDUSERID' : u '0' , u 'Server' : u 'BWS/1.0' , u 'Connection' : u 'Keep-Alive' , u 'Cache-Control' : u 'private' , u 'Date' : u 'Tue, 03 Sep 2013 09:53:56 GMT' , u 'Content-Type' : u 'text/html;charset=utf-8' , u 'BDPAGETYPE' : u '3' }


他的内容:

183150831.png


先这样吧~  更详细的功能大家看官网吧~





 本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1287810,如需转载请自行联系原作者


相关文章
|
1月前
|
数据采集 Web App开发 JavaScript
JavaScript爬虫进阶攻略:从网页采集到数据可视化
JavaScript爬虫进阶攻略:从网页采集到数据可视化
|
2月前
|
数据采集 数据挖掘 API
主流电商平台数据采集API接口|【Python爬虫+数据分析】采集电商平台数据信息采集
随着电商平台的兴起,越来越多的人开始在网上购物。而对于电商平台来说,商品信息、价格、评论等数据是非常重要的。因此,抓取电商平台的商品信息、价格、评论等数据成为了一项非常有价值的工作。本文将介绍如何使用Python编写爬虫程序,抓取电商平台的商品信息、价格、评论等数据。 当然,如果是电商企业,跨境电商企业,ERP系统搭建,我们经常需要采集的平台多,数据量大,要求数据稳定供应,有并发需求,那就需要通过接入电商API数据采集接口,封装好的数据采集接口更方便稳定高效数据采集。
|
6月前
|
数据采集 JSON API
C#网络爬虫实例:使用RestSharp获取Reddit首页的JSON数据并解析
C#网络爬虫实例:使用RestSharp获取Reddit首页的JSON数据并解析
|
1月前
|
数据采集 存储 数据处理
Python爬虫在Django项目中的数据处理与展示实例
Python爬虫在Django项目中的数据处理与展示实例
|
7月前
|
数据采集 存储 安全
利用爬虫技术自动化采集汽车之家的车型参数数据
汽车之家是一个专业的汽车网站,提供了丰富的汽车信息,包括车型参数、图片、视频、评测、报价等。如果我们想要获取这些信息,我们可以通过浏览器手动访问网站,或者利用爬虫技术自动化采集数据。本文将介绍如何使用Python编写一个简单的爬虫程序,实现对汽车之家的车型参数数据的自动化采集,并使用亿牛云爬虫代理服务来提高爬虫的稳定性和效率。
374 0
利用爬虫技术自动化采集汽车之家的车型参数数据
|
7月前
|
数据采集 Python
python 爬虫 佛山区域,爬取餐厅的商户联系人公开号码,实例脚本
python 爬虫 佛山区域,爬取餐厅的商户联系人公开号码,实例脚本
|
3月前
|
数据采集 Python
Python小知识 - 一个简单的Python爬虫实例
Python小知识 - 一个简单的Python爬虫实例
|
4月前
|
数据采集 NoSQL 关系型数据库
Go语言网络爬虫工程经验分享:pholcus库演示抓取头条新闻的实例
网络爬虫是一种自动从互联网上获取数据的程序,它可以用于各种目的,如数据分析、信息检索、竞争情报等。网络爬虫的实现方式有很多,不同的编程语言和框架都有各自的优势和特点。在本文中,我将介绍一种使用Go语言和pholcus库的网络爬虫工程,以抓取头条新闻的数据为例,展示pholcus库的功能和用法。
511 0
Go语言网络爬虫工程经验分享:pholcus库演示抓取头条新闻的实例
|
5月前
|
数据采集 Web App开发 运维
spider 网页爬虫中的 AWS 实例数据获取问题及解决方案
spider 网页爬虫中的 AWS 实例数据获取问题及解决方案
|
5月前
|
数据采集 XML 编译器
Scala爬虫实战:采集网易云音乐热门歌单数据
Scala爬虫实战:采集网易云音乐热门歌单数据