我们在浏览器中看到的画面优美的界面,其实是由浏览器,对网页内容做了解释后,才呈现出来的类似word的WYSIWYG
实质它是一段HTML代码,加JS、CSS等。如果把网页比作一个人,那么HTML便是他的骨架,JS便是他的肌肉,CSS便是它的衣服。最重要的部分是存在于HTML中的。
用一个例子来爬网页
?import urllib2
?response = urllib2.urlopen("http://www.baidu.com")
?print response.read()
这个例子中,真正的程序就两行,把它保存成demo.py,进入该文件的目录,执行如下命令查看运行结果。
?python demo.py
可以看到这个网页的源码已经被爬下来了。
网页爬取方法
那么我们来分析这几行Python代码:
?import urllib2
?response = urllib2.urlopen("http://www.baidu.com")
?print response.read()
第2行
?response = urllib2.urlopen("http://www.baidu.com")
?首先我们调用的是urllib2库里面的urlopen方法,传入一个URL
?这个网址是百度首页,协议是HTTP协议
?当然你也可以把HTTP换做FTP,FILE,HTTPS 等等,只是代表了一种访问控制协议
三个参数
urlopen一般接受三个参数,它的参数如下:
?urlopen(url, data, timeout)
?第一个参数url即为URL,第二个参数data是访问URL时要传送的数据,第三个timeout是设置超时时间。
?第一个参数URL是必须要传送的,本例里传送了百度的URL
?第二三个参数可以不传,
?data默认为空None
?timeout默认为socket._GLOBAL_DEFAULT_TIMEOUT
执行urlopen方法之后,返回一个response对象,返回信息便保存在这里面。
?print response.read()
?response对象有一个read方法,可以返回获取到的网页内容。
第3行
?print response.read()
?如果不加read直接打印会是什么?
?直接打印出了该对象的描述
?<addinfourlat 139728495260376 whose fp= <socket._fileobjectobject at 0x7f1513fb3ad0>>
?所以一定要加read方法
构造Requset
其实上面的urlopen参数,可以传入一个request请求
它其实就是一个Request类的实例,构造时需要传入Url,Data等等的内容。
比如上面的三行代码,我们可以这么改写
?import urllib2
?request = urllib2.Request("http://www.baidu.com")
?response = urllib2.urlopen(request)
?print response.read()
运行结果是完全一样的,只不过中间多了一个request对象
?推荐大家这么写,因为在构建请求时还需要加入好多内容
?通过构建一个request,服务器响应请求得到应答,这样显得逻辑上清晰明确。