2020-爬虫学习-实战练习:爬取豆瓣电影排名前25部的电影信息

本文适合已了解爬虫基础知识的读者,通过实例代码讲解如何爬取并保存豆瓣电影排名前25部电影的相关信息,逐步学习爬虫实战技巧。文章还提供了相关学习资源和上一篇爬虫练习的链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

在开始本文之前,我非常建议先学习下我写的第一篇爬虫练习的文章:https://blog.youkuaiyun.com/hahameier/article/details/110558398,里面有涉及到一些基本的东西。

在本文中,我会循序渐进,从爬取两个信息来带大家熟悉和学习下整体的流程(代码较少,帮助小白克服一堆代码的恐惧),然后才会延伸至多个信息的爬取。

本文将会非常适合知道了一些爬虫的基础知识,但是还没用实际例子来尝试的朋友。

参考链接:

1、百度大脑的教程《深度学习导论与应用实践》第二章节的课后习题:
https://aistudio.baidu.com/aistudio/projectDetail/101811
【但是代码部分已经不适用于现在的版本了,需要进行重构,本文会给出自己写的能运行的最新版的代码。】
2、上一篇自己写的爬虫练习:https://blog.youkuaiyun.com/hahameier/article/details/110558398

核心代码:

1、爬取所需要的内容:
    def getContent(self, html):
        findTitle = re.compile(r'<span class="title">(.*)</span>')  # 找到片名
        findLink = re.compile(r'<a href="(.*?)">')  # 找到影片详情链接
        datalist = []
        for item in html.find_all('div', class_='item'):  # 找到每一个影片项
            data = []
            item = str(item)  # 转换成字符串
            link = re.findall(findLink, item)[0]
            data.append(link)  # 添加详情链接
            titles = re.findall(findTitle, item)
            # 片名可能只有一个中文名,没有外国名;但我们只取中文名
            if len(titles) == 2:
                ctitle = titles[0]
                data.append(ctitle)  # 添加中文片名
                otitle = titles[1].replace("/", "")  # 去掉无关符号
            else:
                data.append(titles[0])  # 添加中文片名
            datalist.append(data)
        return datalist
2、保存所爬取的内容:
    def saveData(self, datalist):
        book = xlwt.Workbook(encoding='utf-8', style_compression=0)
        sheet = book.add_sheet('豆瓣电影Top25', cell_overwrite_ok=True)
        col = ('电影详情链接', '影片中文名')
        for i in range(0, 2):
            sheet.write(0, i, col[i])  # 列名
        for i in range(0, 25):
            for j in range(0, 2):
                print(datalist[i][j])
                sheet.write(i+1, j, datalist[i][j])  # 数据
        book.save(self.path)  # 保存

完整代码:

from bs4 import BeautifulSoup
import re
import xlwt
import requests


class GetTopMovie:
    def __init__(self, url):
        self.url = url
        self.path = r'/Users/NewScenery/SelfLearning-20201203/豆瓣电影Top25.xls'
        self.headers = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS 。。。) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
                      "referer": "https://movie.douban.com/top250?start="
        }  # headers用你们自己的

    # 获取Html
    def getHtml(self, url):
        res = requests.get(url, headers=self.headers)
        if res.status_code == 200:
            html = BeautifulSoup(res.text, 'html.parser')
            return html

        def getContent(self, html):
        findTitle = re.compile(r'<span class="title">(.*)</span>')  # 找到片名
        findLink = re.compile(r'<a href="(.*?)">')  # 找到影片详情链接
        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)  # 找到影片相关内容:导演,主演,年份,地区,类别
        remove = re.compile(r'                            |\n|</br>|\.*')  # 去掉无关内容
        datalist = []
        for item in html.find_all('div', class_='item'):  # 找到每一个影片项
            data = []
            item = str(item)  # 转换成字符串
            # print(item)
            link = re.findall(findLink, item)[0]
            data.append(link)  # 添加详情链接
            titles = re.findall(findTitle, item)
            if len(titles) == 2:  # 中文名字,其他名字
                ctitle = titles[0]
                data.append(ctitle)  # 添加中文片名
                otitle = titles[1].replace("/", "")  # 去掉无关符号
            else:
                data.append(titles[0])  # 添加中文片名
            rating = re.findall(findRating, item)[0]
            data.append(rating)  # 添加评分
            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(remove, "", bd)
            bd = re.sub('<br(\s+)?\/?>(\s+)?', " ", bd)  # 去掉<br >
            bd = re.sub('/', " ", bd)  # 替换/
            data.append(bd.strip())
            datalist.append(data)
        return datalist
    def saveData(self, datalist):
        book = xlwt.Workbook(encoding='utf-8', style_compression=0)
        sheet = book.add_sheet('豆瓣电影Top25', cell_overwrite_ok=True)
        col = ('电影详情链接', '影片中文名')
        for i in range(0, 2):
            sheet.write(0, i, col[i])  # 列名
        for i in range(0, 25):
            for j in range(0, 2):
                print(datalist[i][j])
                sheet.write(i+1, j, datalist[i][j])  # 数据
        book.save(self.path)  # 保存

    def func(self):
        url = self.url
        self.saveData(self.getContent(self.getHtml(url)))

if __name__ == '__main__':
    b = GetTopMovie('https://movie.douban.com/top250?start=')  	# 获取前25部电影
    b.func()
    print('爬取并保存成功!')

后记:

如果对你有收获,请不要吝惜你的双手,给我点个赞吧~哈哈哈
如果有问题的小伙伴可以留言~
要一点一点的进步哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值