使用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('结束')

猜你喜欢

转载自blog.csdn.net/qq_42379006/article/details/80643526