python 网络爬虫初级实现代码


Posted in Python onFebruary 27, 2016

首先,我们来看一个Python抓取网页的库:urllib或urllib2。

那么urllib与urllib2有什么区别呢?
可以把urllib2当作urllib的扩增,比较明显的优势是urllib2.urlopen()可以接受Request对象作为参数,从而可以控制HTTP Request的header部。
做HTTP Request时应当尽量使用urllib2库,但是urllib.urlretrieve()函数以及urllib.quote等一系列quote和unquote功能没有被加入urllib2中,因此有时也需要urllib的辅助。

urllib.open()这里传入的参数要遵循一些协议,比如http,ftp,file等。例如:

urllib.open('http://www.baidu.com')
urllib.open('file:D\Python\Hello.py')

现在有一个例子,下载一个网站上所有gif格式的图片。那么Python代码如下:

import re
import urllib

def getHtml(url):
 page = urllib.urlopen(url)
 html = page.read()
 return html

def getImg(html):
 reg = r'src="(.*?\.gif)"'
 imgre = re.compile(reg)
 imgList = re.findall(imgre,html)
 print imgList
 cnt = 1
 for imgurl in imgList:
  urllib.urlretrieve(imgurl,'%s.jpg' %cnt)
  cnt += 1

if __name__ == '__main__':
 html = getHtml('http://www.baidu.com')
 getImg(html)

根据上面的方法,我们可以抓取一定的网页,然后提取我们所需要的数据。

实际上,我们利用urllib这个模块来做网络爬虫效率是极其低下的,下面我们来介绍Tornado Web Server。
Tornado web server是使用Python编写出来的一个极轻量级、高可伸缩性和非阻塞IO的Web服务器软件,著名的Friendfeed网站就是使用它搭建的。Tornado跟其他主流的Web服务器框架(主要是Python框架)不同是采用epoll非阻塞IO,响应快速,可处理数千并发连接,特别适用用于实时的Web服务。

用Tornado Web Server来抓取网页效率会比较高。
从Tornado的官网来看,还要安装backports.ssl_match_hostname,官网如下:

http://www.tornadoweb.org/en/stable/

import tornado.httpclient

def Fetch(url):
 http_header = {'User-Agent' : 'Chrome'}
 http_request = tornado.httpclient.HTTPRequest(url=url,method='GET',headers=http_header,connect_timeout=200,request_timeout=600)
 print 'Hello'
 http_client = tornado.httpclient.HTTPClient()
 print 'Hello World'

 print 'Start downloading data...'
 http_response = http_client.fetch(http_request)
 print 'Finish downloading data...'

 print http_response.code

 all_fields = http_response.headers.get_all()
 for field in all_fields:
  print field

 print http_response.body

if __name__ == '__main__':
 Fetch('http://www.baidu.com')

urllib2的常见方法:

(1)info() 获取网页的Header信息

(2)getcode() 获取网页的状态码

(3)geturl() 获取传入的网址

(4)read() 读取文件的内容

Python 相关文章推荐
Queue 实现生产者消费者模型(实例讲解)
Nov 13 Python
对python中的six.moves模块的下载函数urlretrieve详解
Dec 19 Python
使用Python操作FTP实现上传和下载的方法
Apr 01 Python
解决python中的幂函数、指数函数问题
Nov 25 Python
解决pycharm启动后总是不停的updating indices...indexing的问题
Nov 27 Python
如何基于python实现脚本加密
Dec 28 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
Feb 29 Python
解决Python发送Http请求时,中文乱码的问题
Apr 30 Python
Python实现一个简单的毕业生信息管理系统的示例代码
Jun 08 Python
Python定义一个函数的方法
Jun 15 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
Feb 01 Python
python中time tzset()函数实例用法
Feb 18 Python
Python数据库的连接实现方法与注意事项
Feb 27 #Python
学习python之编写简单简单连接数据库并执行查询操作
Feb 27 #Python
学习python之编写简单乘法口诀表实现代码
Feb 27 #Python
学习python 之编写简单乘法运算题
Feb 27 #Python
python学习之编写查询ip程序
Feb 27 #Python
用python写的一个wordpress的采集程序
Feb 27 #Python
python结合shell查询google关键词排名的实现代码
Feb 27 #Python
You might like
树型结构列出指定目录里所有文件的PHP类
2006/10/09 PHP
利用discuz实现PHP大文件上传应用实例代码
2008/11/14 PHP
php对象在内存中的存在形式分析
2015/02/03 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
2016/07/14 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
2016/10/18 PHP
解决laravel session失效的问题
2019/10/14 PHP
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
JS随机调用指定函数的方法
2015/07/01 Javascript
javascript创建cookie、读取cookie
2016/03/31 Javascript
KnockoutJS 3.X API 第四章之数据控制流component绑定
2016/10/10 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
JavaScript实现单例模式实例分享
2017/12/22 Javascript
element-ui 的el-button组件中添加自定义颜色和图标的实现方法
2018/10/26 Javascript
js防抖函数和节流函数使用场景和实现区别示例分析
2020/04/11 Javascript
Vue 401配合Vuex防止多次弹框的案例
2020/11/11 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
Python实现可自定义大小的截屏功能
2018/01/20 Python
Python使用itertools模块实现排列组合功能示例
2018/07/02 Python
python对于requests的封装方法详解
2019/01/03 Python
django url到views参数传递的实例
2019/07/19 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
python实现扑克牌交互式界面发牌程序
2020/04/22 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
python中加背景音乐如何操作
2020/07/19 Python
python中的插入排序的简单用法
2021/01/19 Python
YSL圣罗兰美妆美国官网:Yves Saint Lauret US
2016/11/21 全球购物
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
大专生自我鉴定范文
2013/10/01 职场文书
大学生安全责任书
2014/07/25 职场文书
党员对照检查剖析材料
2014/10/13 职场文书
基层党支部承诺书
2015/04/30 职场文书
幼儿园推普周活动总结
2015/05/07 职场文书
Redis的字符串是如何实现的
2021/10/24 Redis
使用javascript解析二维码的三种方式
2021/11/11 Javascript