1. 程式人生 > 實用技巧 >使用Python爬取豆瓣電影詳細資料

使用Python爬取豆瓣電影詳細資料

# -*- codeing = utf-8 -*-
# @Time :  23:35
# @Auther : wyt
# @File : spider.py
# @Software : PyCharm

from bs4 import BeautifulSoup #網頁解析,獲取資料
import re   #正則表示式,進行文字匹配
import urllib.request,urllib.error  #制定url,獲取網頁資料
import xlwt #進行Excel操作
import sqlite3  #進行SQLite資料庫操作


def main():
   baseurl="https://movie.douban.com/top250?start="
    #爬取網頁
   datalist = getData(baseurl)
   savepath = ".\\豆瓣電影Top250.xls"
   #3、儲存資料
   # saveData(savepath)
   #askURL("https://movie.douban.com/top250?start=")

#影片詳情的連結規則
findlink = re.compile(r'<a href="(.*?)">') #建立正則表示式物件,表示規則
#影片圖片
findImgSrc = re.compile(r'<img.*src="(.*?)"',re.S)  #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)
# 1、爬取網頁
def getData(baseurl):
    datalist=[]
    for i in range(0,1):  #呼叫獲取頁面資訊的函式,10次,25個  #修改數量
url = baseurl + str(i*25) html = askURL(url) #儲存獲取到的網頁原始碼 # 2、逐一進行解析資料 soup = BeautifulSoup(html,"html.parser") for item in soup.find_all("div",class_="item"): #查詢符合要求的字串,形成列表 #print(item) #測試,檢視電影item全部資訊 data = [] #儲存一部電影的所有資訊 item = str(item) #影片詳情的連結 link = re.findall(findlink,item)[0] #re庫用來查詢指定的字串, data.append(link) imgs = re.findall(findImgSrc,item)[0] data.append(imgs) titles = re.findall(findTitle,item) if(len(titles)==2): ctitle = titles[0] data.append(ctitle) otitle = titles[1].replace("/","") #去掉無關符號 data.append(otitle) else: data.append(titles[0]) data.append(' ') #外文名沒有的時候,留空 這一步是為了以後匯入資料庫、exls表的時候行列資料不規範 reting = re.findall(findRating,item)[0] data.append(reting) judgeNum = re.findall(findJudge,item)[0] data.append(judgeNum) inq = re.findall(findInq,item) if len(inq)!=0: inq = inq[0].replace("。","") #去掉句號 data.append(inq) else: data.append(" ") bd = re.findall(findBd,item)[0] bd = re.sub(r'<br(\s+)?/>(\s+)?'," ",bd) # 去掉<br/> bd = re.sub(r'/'," ",bd) # 替換 / c = bd.strip() # 去掉前後的空格 data.append(c) datalist.append(data) # 把處理好的一部電影資訊放入datalist print(datalist) return datalist #得到一個指定url的網頁內容: def askURL(url): head = { #摸你瀏覽器頭部資訊,向豆瓣伺服器傳送訊息 "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3776.400 QQBrowser/10.6.4212.400" } #使用者代理:告訴豆瓣伺服器,我們是什麼型別的機器,本質上是告訴瀏覽器我們能接受什麼水平的檔案內容 request = urllib.request.Request(url,headers=head) html = "" try: response = urllib.request.urlopen(request) html = response.read().decode("utf-8") #print(html) except urllib.error.URLError as e: if hasattr(e,"code"): print(e.code) if hasattr(e,"reason"): print(e.reason) return html def saveData(savepath): print("1") if __name__ == "__main__": #當程式被呼叫執行時 #呼叫函式 main()

  

執行結果:

這是爬取了豆瓣電影第一頁的前二十五個電影的詳細內容,可以修改數量,在紅色註釋處,修改range中的數字改為(0,10),則可以爬取前250個電影的詳細資訊。

這段程式碼分別爬取了電影的詳情連結,圖片,片名,評分,評價人數,概況,影片相應內容共計七個屬性並將他們逐一儲存到列表中,然後將列表data儲存到datalist中,最後輸出了datalist。