使用Python爬取豆瓣電影詳細資料
阿新 • • 發佈:2020-11-17
# -*- 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。