博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
爬虫采集-基于webkit核心的客户端Ghost.py [爬虫实例]
阅读量:6816 次
发布时间:2019-06-26

本文共 4789 字,大约阅读时间需要 15 分钟。

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

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

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

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

常见的抓数据的方法:

urllib2+urlparse+re

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

urllib2+beautifulsoup

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

Mechanize+BeautifulSoup

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

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

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

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

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

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

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

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

一个小例子,感受下Ghost~

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

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

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

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

运气好的直接 pip install Ghost.py

运气不好的:

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

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

wget http://sourceforge.net/projects/pyqt/files/sip/sip-4.14.6/sip-4.14.6.tar.gztar zxvf sip-4.14.6.tar.gzcd sip-4.14.6python configure.pymakesudo make installwget http://sourceforge.net/projects/pyqt/files/PyQt4/PyQt-4.10.1/PyQt-mac-gpl-4.10.1.tar.gztar zxvf PyQt-mac-gpl-4.10.1.tar.gzcd PyQt-mac-gpl-4.10.1python configure.pymakesudo make installwget http://pyside.markus-ullmann.de/pyside-1.1.1-qt48-py27apple.pkgopen pyside-1.1.1-qt48-py27apple.pkggit clone https://github.com/mitsuhiko/flask.gitcd flasksudo python setup.py installgit clone git://github.com/carrerasrodrigo/Ghost.py.gitcd Ghost.pysudo python setup.py install

创建一个实例对象:

from ghost import Ghostghost = Ghost()

打开一个页面

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

夹带着 javascript代码

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

模拟点击事件

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

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

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):

result, resources = ghost.fill("form", {    "username": "jeanphix",    "password": "mypassword"})

提交表单~

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

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

这些有很多好用的属性

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实现程序的单元测试:

import unittestfrom flask import Flaskfrom ghost import GhostTestCaseapp = 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~~~

# Opens the web pageghost.open('http://www.openstreetmap.org/')# Waits for form search fieldghost.wait_for_selector('input[name=query]')# Fills the formghost.fill("#search_form", {'query': 'France'})# Submits the formghost.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 linkghost.click(    '#search_osm_nominatim .search_results_entry:first-child a')# Checks if map has moved to expected latitudelat, resources = ghost.evaluate("map.center.lat")assert float(lat.toString()) == 5860090.806537

aha,咱们来个实例哈~    

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

终端下的操作:

得到的是

咱们访问下

看 他的http头

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'}

他的内容:

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

转载地址:http://hubzl.baihongyu.com/

你可能感兴趣的文章
java里的基本知识
查看>>
行走在前端路上的一些想法
查看>>
hdu 5288 ZCC loves straight flush
查看>>
前端爬虫cheerio&&puppeteer
查看>>
Linux日常操作整理
查看>>
rem和em的用法
查看>>
【译】整理->20个让你效率更高的CSS代码技巧
查看>>
Prometheus学习系列(十一)之Hello World
查看>>
IDEA常用设置及推荐插件
查看>>
java多线程基本概述(十一)——ReadWriteLock
查看>>
机器学习 深度学习 计算机视觉 资料汇总
查看>>
深度学习网络结构中超参数momentum了解
查看>>
js几种创建对象的方式
查看>>
微信小程序中this关键字使用技巧
查看>>
multiprocessing的基础用法
查看>>
N的阶乘的长度 V2(斯特林近似) 求 某个大数的阶乘的位数 .
查看>>
第二十二课:运算放大电路
查看>>
geek必备工具列表
查看>>
SVN 目录 定义
查看>>
P2252 取石子游戏
查看>>