一周沒有更新了薪丁,在閱讀crossin.me中jxgx072037寫的代碼時發(fā)現(xiàn)不懂的地方太多,一點點啃下來花費了不少時間灭衷,不過收獲不少次慢,但還沒有對class def dic有進一步的了解,后期再慢慢吸收吧。在他代碼的基礎(chǔ)上進行了簡單修改迫像,也可以正常運行劈愚,先把代碼貼上,比較好的技巧都在注釋中提到了:
# -*- coding: cp936 -*-
import urllib2
import re
import time
f=urllib2.urlopen('http://movie.douban.com/tag/?view=type').read()#抓取tag
n1=f.find('/h2')#定位抓取位置頭
n2=f.find('2015')#定位抓取位置尾
f1=f[(n1-4):(n2+10)]#定位抓取范圍
f2=re.findall('/\S{1,}"',f1)#初步抓取tag
f3=''.join(f2)#轉(zhuǎn)為str闻妓,方便后面replace
f4=f3.replace('"','')#去除雜質(zhì)
movie_tags=f4.split('/')#轉(zhuǎn)為list菌羽,方便后面[]
del movie_tags[0]#
#print len(movie_tags)
#print movie_tags
class Movie_list:#建立Movie_list類,方便后面引用
def __init__(self):#
self.url1='http://movie.douban.com/tag/'#
def request_open(self,n1,n2):#為提取文本定義函數(shù)request_open,n1為tag由缆,n2為頁數(shù)
self.url2='?start='+str(n2*20)+'&type=T'#n2*20是通過觀察頁面得出規(guī)律注祖,url后半段,方便拼接url
self.page1=urllib2.urlopen(self.url1+movie_tags[n1]+self.url2).read()#將url1均唉、tag是晨、url2三部分拼接起來,提取每個頁面的電影信息
return self.page1#將self.page1值返回給request_open
class Next_page:#
def __init__(self):#
self.url1='http://movie.douban.com/tag/'#
def np(self,n1):#為提取頁面數(shù)定義函數(shù)np舔箭,n1為tag
self.page1=urllib2.urlopen(self.url1+movie_tags[n1]).read()#將url1罩缴、tag兩部分拼接起來,提取每個tag的信息
self.url2=re.findall('type=T.*\d{1,2}',self.page1)#從tag中提取該tag的標簽頁
#print self.url2[-1]
#print self.url2[-1][9:]
if self.url2:#if為self.url2篩選值层扶,如果為真值箫章,則進下以下步驟
self.num2=self.url2[-1][9:]#取出雜質(zhì),self.url2為list镜会,[-1]取最后一個值檬寂,[9:]提取單獨的頁碼值,非常簡潔的提取方式
#print self.num2
if int(self.num2)<10 or int(self.num2)==10:#通過最后一個頁面數(shù)進行判斷是否大于10頁
return int(self.num2)#如果不大于10頁稚叹,就全部提取
else:#大于10頁
return 10#就賦值10.只提取10頁
#print self.num2
else:#如果self.url2為False
return 1#則賦予值1
#print self.num2
movie_list=Movie_list()#實例MOvie_list()
movie=[]#建立空list焰薄,方便后面append
class Movie_info:
def __init__(self):
pass
def m(self,n1,n2):#定義m函數(shù)提取movie信息,n1為tag值 n2為頁碼值
self.movie_name2=[]#電影名空list
self.movie_name1=re.findall('title="\S{1,}?"',movie_list.request_open(n1,n2))#初步提取所有頁面的電影名扒袖,
for x in range(len(self.movie_name1)-1):#循環(huán)讀取
self.movie_name2.append(self.movie_name1[x][7:-1])#去除雜質(zhì)塞茅,添加到list
#print self.movie_name1[x][7:-1]
self.movie_comment2=[]#電影評論人數(shù)空list
self.movie_comment1=re.findall('\(\d{1,}.*?\)|\(\xe5\xb0\x9a\xe6\x9c\xaa\xe4\xb8\x8a\xe6\x98\xa0\)|\(\xe7\x9b\xae\xe5\x89\x8d\xe6\x97\xa0\xe4\xba\xba\xe8\xaf\x84\xe4\xbb\xb7\)|\(\xe5\xb0\x91\xe4\xba\x8e10\xe4\xba\xba\xe8\xaf\x84\xe4\xbb\xb7\)|\(\xe8\xaf\x84\xe4\xbb\xb7\xe4\xba\xba\xe6\x95\xb0\xe4\xb8\x8d\xe8\xb6\xb3\)',movie_list.request_open(n1,n2))
for s in self.movie_comment1:#循環(huán)讀取
#print s
if re.findall('\d{1,}',s):#初步提取頁碼值
#print re.findall('\d{1,}',s)[0]
self.movie_comment2.append(re.findall('\d{1,}',s)[0])#去除雜質(zhì)
else:
self.movie_comment2.append('0')
#print self.movie_comment2
#提取評分信息
self.movie_rating2=[]
self.movie_rating1=re.findall('class=\"star clearfix[\s\S]*?pl',movie_list.request_open(n1,n2))
for s in self.movie_rating1:
self.p2=re.findall('\d\.\d',s)
if self.p2:
self.movie_rating2.append(self.p2[0])
else:
self.movie_rating2.append('沒有評分')
#提取電影URL
self.movie_url2=[]
self.n=0
self.movie_url1=re.findall('http://movie.douban.com/subject/\d{1,10}',movie_list.request_open(n1,n2))
for i in range(len(self.movie_url1)/2):
self.movie_url2.append(self.movie_url1[2*self.n])
self.n+=1
#將提取到的信息添加到dic中
for i in range(len(self.movie_name2)):
self.dic=[]
self.dic.append(self.movie_name2[i])
self.dic.append(self.movie_comment2[i])
self.dic.append(self.movie_rating2[i])
self.dic.append(self.movie_url2[i])
#self.dic[1]代表comment,評論人數(shù)大于50000的記錄季率,不到的不記錄
if int(self.dic[1])>50000:
movie.append(self.dic)
#電影名進行排重
if len(movie)>2:
for i in range(len(movie)-1):
#如果最新添加的電影名同原來記錄中的任意一項相同
if movie[-1][0]==movie[i][0]:
#print moive[-1]
#刪除最新添加的野瘦,即去重
del movie[-1]
#去重后 中止循環(huán)
#break
print '%d/3000'%(len(movie))
else:
continue
next_page=Next_page()
movie_info=Movie_info()
for x in range(len(movie_tags)-130):#循環(huán)標簽,為減少工作量飒泻,僅抓取7個標簽鞭光,len(movie_tags)=137
print'正在抓取標簽"%s"中的電影,%d/%s'%(movie_tags[x],x+1,len(movie_tags)-130)#查看抓取記錄
starttime2=time.time()#起始時間
for i in range(next_page.np(x)):#循環(huán)頁面
print'開始抓取第%d頁,抓取進度:'%(i+1)
starttime=time.time()
movie_info.m(x,i)#將標簽值泞遗、頁面值賦予m函數(shù)
endtime2=time.time()
print'抓取第%d頁完畢惰许,用時%.2fs'%(i+1,endtime2-starttime2)
#time.sleep(5)
endtime2=time.time()
print '抓取"%s"標簽完畢,%d/%s,用時%.2fs\n'%(movie_tags[x],x+1,len(movie_tags)-130,endtime2-starttime2)
'''if len(movie)>100:
print len(movie)
for i in range(len(movie)-100):
print i
print len(movie)-100
print movie[-i]
del movie[-i]
'''
def comment(s):
return int(s[1])
starttime4=time.time()
print'開始排序……'
movie.sort(key=comment,reverse=True)
endtime4=time.time()
print'排序完畢史辙,共耗時%.2f'%(endtime4-starttime4)
f=file('Douban_movies.html','w')#創(chuàng)建并打開html
#html頭
f.write('\n\n\n')
f.write('\n')
f.write('\n\n\n')
f.write('
豆瓣電影榜單
'+' '+'
按評價人數(shù)排名
')
s=1
for i in movie:
f.write('
'+str(s)+'. '+''+i[0]+''+'汹买,共'+i[1]+'人評價佩伤,'+'得分:'+i[2]+'分;'+'\n')
s+=1
f.write('')
f.close
print'完成晦毙!請查看html文件生巡,獲取豆瓣電影榜單。'
豆瓣爬蟲學習见妒,先告一段落孤荣,自己接下來會隨意在網(wǎng)上找個小網(wǎng)站實踐抓取下,這樣對理解爬蟲會有更有幫助