爬虫是互联网上最常见的一种东西了吧。

爬虫这东西每天都在网上爬大量的信息,各大搜索引擎厂商每天都有上百万的爬虫在网络上活动,这些爬虫的作用就是给搜索引擎采集互联网上最新的内容,采集来的内容经过分类、加工之后,进入搜索引擎的索引。这是爬虫最常见的应用。

关于搜索引擎的理论非常多,应该已经形成系统的理论和方法了。这里不再多追求搜索引擎的细节,只来看看爬虫如何爬有效的信息。

ps. 这个博客已经很久没有更新了。现在时间越来越少,平时鲜有时间来更新博客了。

最近某人发现,python其实是一种很适合写爬虫的语言,而且python越用越顺手。现在若是有人问我“c++和c#学哪一个?“之类的问题的时候,我一定会说,学python吧,因为生命短暂,你应该学习python。

所谓爬虫,就是把网页的html下载下来,然后从里面提取出来有用的信息,这些有用的信息一般就是正文,图片,链接一类的信息。

针对特定网站的爬虫就更好写了,用正则表达式,把网页里的链接信息找到,然后找到需要的信息,保存在本地,然后进入下一个链接重复上一次的过程。

下面的脚本演示如何从加菲猫的官网上把从1978年至今的所有漫画全部下载下来

import os,urllib,urllib2,re

hosts = "http://www.gocomics.com"
#initpos = "/mobile/garfield/1978/06/19"
initpos ="/mobile/garfield/1979/08/08"
pname = re.compile('''<span class="authorText">.+?<em>(.*?)</em></span>''')
pcomic = re.compile('''<div id="comic".+?src="(.*?)".+?</div>''')
pnext = re.compile('''<a href="(.*?)" class="next">''')

def getpage(url):
print url
req = urllib2.Request(url)
req.add_header("User-Agent","Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0")
req.add_header("If-None-Match","c1858c2845ca9501136ca83d624f8d4d")
u = urllib2.urlopen(req).read()
return u

def getnextpos(content,patten):
r = patten.findall(content)
for x in r:
print 'find next: ',x
return x

def savecomic(content,patten):
r = patten.findall(content)
print 'find commic:',r
r2 = pname.findall(content)
print 'find name:',r2
urlcomic = r[0]
u = urllib.urlopen(urlcomic).read()
name = r2[0].replace(' ','').split(',')
year = name[-1]
day = name[-2]
filename = 'test.jpg'
if not os.path.exists(year):
os.makedirs(year)
# is gif file ,the name the file as gif
if ((u[0] is 'G') and (u[1] is 'I') and (u[2] is 'F')):
filename = year+day+'.gif'
else:
filename = year+day+'.jpg'
f = file(year+"/"+filename,"wb+")
f.write(u)
f.close()

def main():
url = hosts+initpos
while(True):
c = getpage(url)
savecomic(c,pcomic)
u = getnextpos(c,pnext)
if u is None:
break
else:
url = hosts+u

if __name__ == '__main__':
main()