spider中的一些trick
在使用spider进行网页爬取前,先对网站进行分析,主要的看以下这些:
mete原标签、charset字符集、context文本类型、状态码code、last-modified网站最后更新时间、server服务器类型
1.通过Google的chrome浏览器随便打开一个网页"http://www.tieba.baidu.com/p/4654863742"(一个百度贴吧美女壁纸图片),右键鼠标打开网页源码,可以看到网页meta
(百度贴吧对网页进行了压缩,看起来不是很直观)可以看到网页的编码是utf-8,这是很重要的,因为不同的编码格式对字符串匹配会出现乱码问题。
有些网站是gb2312编码,但我们可以通过转换为utf-8:
url="http://www.tieba.baidu.com/p/4654863742"
html=urllib.urlopen(url).read().decode('gbk').encode('utf-8')
#假如原始网页编码为gb2312
2. 上面说到了编码的重要性,我们在自动抓取网页时不可能一张一张网页的去看它是上面编码格式,再进行抓取,因此可以通过第三方库chardet来进行检测:
import chardet
url="http://www.tieba.baidu.com/p/4654863742"
html=urllib.urlopen(url).read()
result=chardet.detect(html)
print result
result的结果为一个字典,第一个为置信度,后面是数值;第二个为编码格式:{'confidence':0.99,'encoding':utf-8}.一般大于0.9的都是可信的。
3.网页的一些主要信息通过info()来获取:
import urllib
url="http://www.tieba.baidu.com/p/4654863742"
html=urllib.urlopen(url)
information=html.info()
print information
其输出结果如下:
Content-Type: text/html; charset=UTF-8
Date: Sun, 04 Sep 2016 04:47:57 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Server: Apache
.......
其中有文本格式,编码方式,访问时间,服务器名称等等,限于篇幅就不一一列举了。
4.状态码通过getcode()这个函数获取。
几种常见的状态码:
200:网页正常打开
301:网页重定向(比如直接在浏览器工具栏输入baidu.com可以直接打开百度,百度会自动添加http://www.这些前缀)
404:网页不存在
403:禁止访问
500:服务器繁忙
getcode()返回的是一个int型的数值,我们可以通过一个判断语句来判断网站是否可以正常访问:
import urllib
url="http://www.tieba.baidu.com/p/4654863742"
html=urllib.urlopen(url)
web_status=html.getcode()
if web_status==200:
print web_status,"网页正常打开"
else:
print web_status,"网页打开异常"
5.网页下载到本地通过urlretrive()完成:
import urllib
url="http://www.tieba.baidu.com/p/4654863742"
urllib.urlretrive(url,"c\\user\\my_doc\\baidu_tieba.html")
6.读取进度通过自定义的callback(a,b,c)完成:
def callback(a,b,c):
'''
a是目前为止传递的数据块数量
b是每个数据块的大小,单位为byte
c是远程文件的大小
'''
down_pregress=100.0*a*b/c
if down_pregress>100:
down_pregress=100
print"%.2f%%"%down_pregress, #.2f表示控制小数位保留两位
7.完整代码如下: