1. 程式人生 > >使用BeautifulSoup方法抓取豆瓣電影資訊

使用BeautifulSoup方法抓取豆瓣電影資訊

# -*- 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('結束')