爬取豆瓣电影Top250

大家好,我是一名非计算机专业但对python爬虫十分感兴趣的电子商务大二学生

这个代码是我用于日后回看以及给大家参考参考,一起交流交流用的

可以转载,但注明一下原创谢谢!

 

引用库:

re

bs4

xlwt

urllib

 

直接上完整代码:

# -*- coding = utf-8 -*-
# @Time : 2021/5/27 9:43
# @Author: 松松
# @file: pc_douban.py
# @Software: PyCharm  开发环境

from bs4 import BeautifulSoup
import re
import urllib.request,urllib.error
import xlwt

def main():
    baseurl = "https://movie.douban.com/top250?start="
    # 爬取网页
    datalist = getdata(baseurl)
    # 保存路径
    savepath = "豆瓣电影TOP250.xls"
    # 保存数据
    savedata(datalist,savepath)
    # askurl("https://movie.douban.com/top250?start=0")  # 尝试执行单个页面的爬取

# 定义全局变量以及定义获取影片详情页规则
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>')
# 评价的人数
findratingp = re.compile(r'<span>(\d*)人评价</span>')
# 金句评价
findinq = re.compile(r'<span class="inq">(.*)</span>')
# 相关内容
findbd = re.compile(r'<p class="">(.*?)</p>', re.S)

# 爬取网页
def getdata(baseurl):  # 获取数据
    datalist = []  # 获取的数据整合成一个列表
    for i in range(0, 10):  # 调用获取页面的函数
        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)
            '''这里是只拿出一个详情页的代码【html】方便观察
            print(item)
            break
            '''
            # 获取影片详情页
            link = re.findall(findlink, item)[0]  # re库用来通过正则表达式查找指定的字符串,[0]表示只要内容,不加的话就是一个个列表
            data.append(link)                     # 添加链接

            imgsrc = re.findall(findimgsrc, item)[0]
            data.append(imgsrc)                   # 添加图片

            titles = re.findall(findtitle, item)  # 片名可能只有一个
            if len(titles) == 2:
                cntitle = titles[0]
                data.append(cntitle)              # 添加中文名字
                ortitle = titles[1].replace("/", "")  # 去掉无关的符号
                data.append(ortitle)              # 添加外国名字
            else:
                data.append(titles[0])            # 无论你有没有外文名字都打出来,防止乱序
                data.append(' ')                  # 留空

            rating = re.findall(findrating, item)[0]
            data.append(rating)                   # 添加评价

            ratingp = re.findall(findratingp, item)[0]
            data.append(ratingp)                  # 添加评价人数

            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('<br(\s+)?/>(\s+)?',"", bd)   #去掉<br/>
            bd = re.sub('/'," ", bd)               #去掉/
            data.append(bd.strip())                #去掉内容前后的空格

            datalist.append(data)                  # 把一部电影的信息放到datalist中
    # print(datalist)
    return datalist


# 得到指定的一个网页的信息
def askurl(url):
    head = {  # 模拟浏览器头部信息,向豆瓣服务奇发送信息
        "User-Agent": "Mozilla/5.0(Windows NT 10.0;Win64;x64) AppleWebKit/537.36(KHTML,like Gecko) Chrome/90.0.4430.212 Safari/537.36"
    }  # 用户代理,告诉豆瓣服务器我们可以接受什么类型的内容
    request = urllib.request.Request(url, headers=head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")
    except urllib.error.URLError as e:
        if hasattr(e, "code"):
            print(e.code)
        if hasattr(e, "reason"):
            print(e.reason)
    return html

# 保存数据
def savedata(datalist,savepath):
    print("开始保存中。。。。")
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)  # 创建workbook对象,style_compression=0为样式的压缩效果
    sheet = book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True)  # 创建工作表,cell_overwrite_ok=True覆盖原来的单元cell
    # 设定列的内容
    col = ("电影详情链接","电影图片链接","电影中文名字","电影外国名字","评分","评分人数","金句评价","相关内容")
    for i in range(0,8):  # 因为excel也是从第0个开始
        sheet.write(0,i,col[i])  # 写入列名
    for i in range(0,250):
        print("第%d条"%(i+1))
        data = datalist[i]
        for j in range(0,8):  # 一行的内容放在一行
            sheet.write(i+1,j,data[j])  # i+1是因为第一行为列名,j为对应的列数数据

    book.save(savepath)

if __name__ == "__main__":
    # 调用函数
    main()
    print("爬取完毕!")

 

结果展示:

【为了引起不必要的争议,我加了码,大家凑活着看吧】

爬取豆瓣电影Top250

 

以上是爬取豆瓣top250电影榜的全部

如果代码有什么可以优化的可以提出来哦

大家一起学习学习

 

上一篇:获取豆瓣Top250电影信息 -- 毕设版 (持续更新)


下一篇:python爬虫——豆瓣电影TOP250数据