python爬虫的三个版本:
1. 基于urllib, urllib2
基于http请求响应的封装。有局限性,因为不能处理动态的脚本如js,一些操作无法实现。
2. 内嵌webbrowser
如pyqt的webkit,pamie, spynner(基于webkit)
这种内嵌的方式类似于com调用,支持所有浏览器的操作,兼容性好,但不如urllib快捷。
3. web test framwork
如selenium。 综合了1,2两种方式,selenium IDE还可以生成代码,是一个强大的web测试工具。
http://selenium.seleniumhq.org/ selenium学习网站
一个设计良好的爬虫架构必须满足的要求
2013-09-01 23:54:42
分类: Python/Ruby
(1)分布式:爬虫应该能够在多台机器上分布执行;
(2)可伸缩性:爬虫结构应该能够通过增加额外的机器和带宽来提高抓取速度;
(3)性能和有效性:爬虫系统必须有效地使用各种系统资源,例如,处理器、存储空间和网络带宽。
(4)质量:鉴于互联网的发展速度,大部分网页都不可能及时出现在用户查询中,所以爬虫应该首先抓区有用的网页。
(5)新鲜性:在许多应用中,爬虫应该持续运行而不是只遍历一次。
(6)更新:因为网页会经常更新,例如论坛网站会经常有回帖。爬虫应该尽可能取得已经获取的页面的新的拷贝。例如一个搜索引擎爬虫要能保证全文索引中包 含每个索引页面的较新的状态。对于搜索引擎爬虫这样的连续的抓取,爬虫访问一个页面的频率应该和这个网页的更新频率一致。
(7)可扩展性:为了能够支持新的数据格式和新的抓取协议,爬虫架构应该设计成模块化的形式。
写了那么多篇找工作的文章,再写几篇就完了,也算是对自己一段时间的一个总结。近来发现自己博客上python技术点的文章有点少,为了防止自己总是遗忘,还是写出来的好。
前几天刚看完《Linux/Unix设计思想》,真是一本不错的书,推荐想提高自己代码质量的童鞋看一下,里面经常提到要以小为美,一个程序做好一件事,短小精悍,因此我也按照这种思想来写python技术点的文章,每个点都是一个函数,可以直接拿来用。
开始了
一般情况下用python的童鞋是不可避免的要写一些爬虫程序的,因此对python中urllib和urllib2都比较熟悉。而最基本的爬取方法就是:
大多数网站都不会禁止这样的爬取,但是有些网站都设定了禁止爬虫爬取,当然这样一方面是为了保护内容的版权,另一方面也是为了方式过多的爬虫造成网站流量的白白浪费。恶意爬取某一网站的内容当然是不道德的行为了,这里只讨论技术。
下面的函数通过urllib2来模拟浏览器访问链接爬取内容:
仅仅是模拟浏览器访问依然是不行的,如果爬取频率过高依然会令人怀疑,那么就需要用到urllib2中的代理设置了,如下:
要使用这个函数,当然你得找一些代理服务器了,这些资源网上有很多,关键字:http代理
关于网页抓取的方法其实还有其他的方法,技术是很灵活的东西,就看你怎么用
写了那么多篇找工作的文章,再写几篇就完了,也算是对自己一段时间的一个总结。近来发现自己博客上python技术点的文章有点少,为了防止自己总是遗忘,还是写出来的好。
前几天刚看完《Linux/Unix设计思想》,真是一本不错的书,推荐想提高自己代码质量的童鞋看一下,里面经常提到要以小为美,一个程序做好一件事,短小精悍,因此我也按照这种思想来写python技术点的文章,每个点都是一个函数,可以直接拿来用。
开始了
一般情况下用python的童鞋是不可避免的要写一些爬虫程序的,因此对python中urllib和urllib2都比较熟悉。而最基本的爬取方法就是:
urllib.urlopen(url).read()
大多数网站都不会禁止这样的爬取,但是有些网站都设定了禁止爬虫爬取,当然这样一方面是为了保护内容的版权,另一方面也是为了方式过多的爬虫造成网站流量的白白浪费。恶意爬取某一网站的内容当然是不道德的行为了,这里只讨论技术。
下面的函数通过urllib2来模拟浏览器访问链接爬取内容:
def get_url_content(url): i_headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1) Gecko/20090624 Firefox/3.5",\ "Referer": 'http://www.baidu.com'} req = urllib2.Request(url, headers=i_headers) return urllib2.urlopen(req).read()
仅仅是模拟浏览器访问依然是不行的,如果爬取频率过高依然会令人怀疑,那么就需要用到urllib2中的代理设置了,如下:
def get_content_by_proxy(url, proxy): opener = urllib2.build_opener(urllib2.ProxyHandler({'http':proxy}), urllib2.HTTPHandler(debuglevel=1)) urllib2.install_opener(opener) i_headers = {"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1) Gecko/20090624 Firefox/3.5", \ "Referer": 'http://www.baidu.com'} req = urllib2.Request(url, headers=i_headers) content = urllib2.urlopen(req).read() return content
要使用这个函数,当然你得找一些代理服务器了,这些资源网上有很多,关键字:http代理
关于网页抓取的方法其实还有其他的方法,技术是很灵活的东西,就看你怎么用