使用BeautifulSoup方法抓取豆瓣電影資訊
阿新 • • 發佈:2019-02-17
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import chardet
import re
import xlwt
#獲取某頁的內容
def getHtml(index=0):
print('正在抓取第{}頁資訊'.format(index+1))
url = 'https://movie.douban.com/top250?start='+str(index*25)+'&filter='
r = requests.get(url)
code = chardet.detect(r.content)['encoding' ]
# print(code) #utf-8
return r.content.decode(code)
def getData(page):
dataList = []
for i in range(page):
html = getHtml(i)
soup = BeautifulSoup(html,'html.parser')
#先找到父元素
parent = soup.find('div',attrs={'id':'content'}) #一定要先找到id的位置,通過id的位置找到父元素
# print(type(parentDiv)) #<class 'bs4.element.Tag'>
lis = parent.find_all('li')
for each in lis:
data = []
#獲取電影名稱
filmName = each.find('div',attrs={'class': 'hd'}).find('span',attrs={'class': 'title'}).string # 方法三
data.append(filmName)
#獲取電影放映時間
reg1 = re.compile('.*(\d{4}).*' ) # 通過正則只獲取中間的4個數字
filmTimeStr = each.find('div',attrs={'class': 'bd'}).find('p').get_text()
filmTime = re.findall(reg1,filmTimeStr)[0] #獲取第一個匹配的正則數字
data.append(filmTime)
# 獲取電影評分
film_score = each.find('div',attrs={'class':'star'}).find_all('span')[1].get_text()
data.append(film_score)
#獲取電影評分人數each
reg2 = re.compile('(\d*)') #匹配任意個數字
discussNumStr = each.find('div',attrs={'class': 'star'}).find_all('span')[3].get_text()
discussNum = re.findall(reg2, discussNumStr)[0] # 獲取第一個匹配的正則數字
data.append(discussNum)
#獲取電影影評, 因為有個別沒有簡評標籤,所以加判斷
if each.find('p', attrs={'class': 'quote'}): #判斷是否有p物件
filmReview = each.find('p', attrs={'class': 'quote'})\
.find('span').get_text() #如果p標籤裡只有一個span就不需要指定span的attrs
else:
filmReview = ''
data.append(filmReview)
dataList.append(data)
return dataList
# print(getData())
def saveToExcel(page,filename):
wbk = xlwt.Workbook()
sheet = wbk.add_sheet('豆瓣電影資訊')
dataList = getData(page)
title_list = ["電影名稱", "上映時間", "豆瓣評分", "豆瓣影評"]
# 寫入表頭
for i in range(len(title_list)):
sheet.write(0, i, title_list[i])
#寫入電影資料
for j,each in enumerate(dataList):
for k,value in enumerate(each):
sheet.write(j+1,k,value)
wbk.save(filename)
saveToExcel(10,'豆瓣電影排行榜.xls')
print('結束')