利用python爬取豆瓣電影Top250的相關資訊,包括電影詳情連結,圖檔連結,影片中文名,影片外國名,評分,評價數,概況,導演,主演,年份,地區,類别這12項内容,然後将爬取的資訊寫入Excel表中。基本上爬取結果還是挺好的。具體代碼如下:
#!/usr/bin/python
#-*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf8')
from bs4 import BeautifulSoup
import re
import urllib2
import xlwt
#得到頁面全部内容
def askURL(url):
request = urllib2.Request(url)#發送請求
try:
response = urllib2.urlopen(request)#取得響應
html= response.read()#擷取網頁内容
#print html
except urllib2.URLError, e:
if hasattr(e,"code"):
print e.code
if hasattr(e,"reason"):
print e.reason
return html
#擷取相關内容
def getData(baseurl):
findLink=re.compile(r'<a href="(.*?)" target="_blank" rel="external nofollow" >')#找到影片詳情連結
findImgSrc=re.compile(r'<img.*src="(.*jpg)"',re.S)#找到影片圖檔
findTitle=re.compile(r'<span class="title">(.*)</span>')#找到片名
#找到評分
findRating=re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#找到評價人數
findJudge=re.compile(r'<span>(\d*)人評價</span>')
#找到概況
findInq=re.compile(r'<span class="inq">(.*)</span>')
#找到影片相關内容:導演,主演,年份,地區,類别
findBd=re.compile(r'<p class="">(.*?)</p>',re.S)
#去掉無關内容
remove=re.compile(r' |\n|</br>|\.*')
datalist=[]
for i in range(,):
url=baseurl+str(i*)
html=askURL(url)
soup = BeautifulSoup(html, "html.parser")
for item in soup.find_all('div',class_='item'):#找到每一個影片項
data=[]
item=str(item)#轉換成字元串
#print item
link=re.findall(findLink,item)[]
data.append(link)#添加詳情連結
imgSrc=re.findall(findImgSrc,item)[]
data.append(imgSrc)#添加圖檔連結
titles=re.findall(findTitle,item)
#片名可能隻有一個中文名,沒有外國名
if(len(titles)==):
ctitle=titles[]
data.append(ctitle)#添加中文片名
otitle=titles[].replace(" / ","")#去掉無關符号
data.append(otitle)#添加外國片名
else:
data.append(titles[])#添加中文片名
data.append(' ')#留白
rating=re.findall(findRating,item)[]
data.append(rating)#添加評分
judgeNum=re.findall(findJudge,item)[]
data.append(judgeNum)#添加評論人數
inq=re.findall(findInq,item)
#可能沒有概況
if len(inq)!=:
inq=inq[].replace("。","")#去掉句号
data.append(inq)#添加概況
else:
data.append(' ')#留白
bd=re.findall(findBd,item)[]
bd=re.sub(remove,"",bd)
bd=re.sub('<br>'," ",bd)#去掉<br>
bd=re.sub('/'," ",bd)#替換/
#data.append(bd)
words=bd.split(" ")
for s in words:
if len(s)!= and s!=' ':#去掉空白内容
data.append(s)
#主演有可能因為導演内容太長而沒有
if(len(data)!=):
data.insert(,' ')#留白
datalist.append(data)
return datalist
#将相關資料寫入excel中
def saveData(datalist,savepath):
book=xlwt.Workbook(encoding='utf-8',style_compression=)
sheet=book.add_sheet('豆瓣電影Top250',cell_overwrite_ok=True)
col=('電影詳情連結','圖檔連結','影片中文名','影片外國名',
'評分','評價數','概況','導演','主演','年份','地區','類别')
for i in range(,):
sheet.write(,i,col[i])#列名
for i in range(,):
data=datalist[i]
for j in range(,):
sheet.write(i+,j,data[j])#資料
book.save(savepath)#儲存
def main():
baseurl='https://movie.douban.com/top250?start='
datalist=getData(baseurl)
savapath=u'豆瓣電影Top250.xlsx'
saveData(datalist,savapath)
main()
Excel表部分内容如下: