豆瓣250


一直想做一个 豆瓣250电影 看了多少的东西,

1. 准备豆瓣数据

# 爬虫代码改自:https://blog.csdn.net/Mu_yongheng/article/details/114048247

from bs4 import BeautifulSoup      # 网页解析,获取数据
import re        # 正则表达式,进行文字匹配
import urllib.request, urllib.error    # 指定URL,获取网页数据
import xlwt      # 进行excel操作
import sqlite3   # 进行SQLite数据库操作

# 影片链接
findLink = re.compile(r'<a href="(.*?)">')  # 创建正则表达式对象(规则)
# 图片
findImgSrc = re.compile(r'<img.*src="(.*?)"')
# 片名
findTitle = re.compile(r'<span class="title">(.*)</span>')
# 影片评分
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
# 评价人数
findJudge = re.compile(r'<span>(\d*)人评价</span>')

def getData(baseurl):
    datalist = []
    for i in range(0, 10):
        n = str(i*25)   # 页数
        url = baseurl + n  # 每一页的网址
        html = askURL(url)  # 访问每一个网页的内容

        # 逐一解析数据
        soup = BeautifulSoup(html, "html.parser")
        # 找到所要信息所在的网页中的位置
        for item in soup.find_all('div', class_="item"):
            # print(item)
            data = []  # 保存一部电影的全部信息
            item = str(item)
            # 获取到影片的超链接
            link = re.findall(findLink, item)[0]   # 获取电影链接
            data.append(link)  # 添加电影链接
            imgSrc = re.findall(findImgSrc, item)[0]  # 获取图片链接
            data.append(imgSrc)
            title = re.findall(findTitle, item)  # 获取电影名称
            if(len(title) == 2):                 # 区分中文名称和外文名称
                data.append(title[0])
                otitle = title[1].replace("/", "")
                data.append(otitle)
            else:
                data.append(title[0])
                data.append(' ')  # 如果没有外文名称则用空格占位,防止混乱
            rating = re.findall(findRating, item)[0]   # 获取评分
            data.append(rating)
            judge = re.findall(findJudge, item)[0]   # 获取评价人数
            data.append(judge)
            
            datalist.append(data)  # 将一步电影的所有爬取信息存入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/88.0.4324.150 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):
    workbook = xlwt.Workbook(encoding="utf-8")  # 创建workbook对象
    worksheet = workbook.add_sheet('sheet1')  # 创建工作表
    # 创建列名
    col = ("影片链接", "图片链接", "影片中文名称", "影片外文名称", "影片评分", "评价人数")
    for i in range(0, 6):  # 写入列名
        worksheet.write(0, i, col[i]) # 列名
    for i in range(0, 250):  # 写入电影信息
        print("第{}行".format(i+1))
        data = datalist[i]
        for j in range(0, 6):
            worksheet.write(i+1, j, data[j])
    # 保存文件
    workbook.save(savepath)

def main():
    # 要爬取的网址
    baseurl = "https://movie.douban.com/top250?start="
    # 1.爬取网页
    datalist = getData(baseurl)
    # 3.保存数据
    savepath = "豆瓣电影Top250.xls"
    saveData(datalist, savepath)

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

2. 准备自己的数据

对着豆瓣250的单子输入 1 0 2

  • 1 表示 看过
  • 0 表示 没看过
  • 2 表示 不清楚
res = "1111111211111111111111010111112101021001122101200021111212111111101111101010110001002000000010101101001100111000011101100010011100010002020100000000100000200100022201000011000001000000000000000000002000200000000010000000000000000200002000000010010021"

print(len(res))

后续,应该可以爬取查看自己看过没

3. 准备基础的前端

配色网站

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"> 
        <title>豆瓣250打卡</title> 
        <style>
        .flex-container {
            display: -webkit-flex;
            display: flex;
            -webkit-justify-content: center;
            justify-content: center;
            width: 100%;
            background-color: #fefdca;
        }
        
        .flex-item {
            border-radius: 10px;
            background-color: #a5dee5;
            width: 8%;
            height: 100px;
            margin: 10px;
        }

        .introduce {
            padding-top: 2rem;
            height: 10rem;
            background-color: #fefdca;
        }

        .color1 {
            background-color: #e0f9b5;
        }

        .color0 {
            background-color: #ffcfdf;
        }

        .color2 {
            background-color: #a5dee5;
        }

        h1{
            text-align: center;
        }

        p{
            text-align: center;
        }

        .flex-item a{
            color: #000;
            font-weight: bold;
            font-size: 1.4rem;
            font-family: 'SimSun', Courier, monospace;
            text-decoration: none;
        }
        </style>
    </head>
<body>
    <div class = "introduce">
        <h1>公告</h1>
        <p>这是一个豆瓣250刷电影的页面。欢迎访问啊</p>
    </div>
    <div class="flex-container">
        <div class="flex-item color1">001<br><br><a href="https://movie.douban.com/subject/1292052/" target="_blank">《肖申克的救赎》<br></a></div>
    </div>   
</body>
</html>

4. 生成部分HTML

先查看第一步得到的数据:

import pandas as pd
df = pd.read_excel("豆瓣电影Top250.xls")
df.head(10)

之后:

for i in range(25):
    print("<div class=\"flex-container\">")
    for j in range(10):
        idx = i*10+j
        print("<div class=\"flex-item color{}\">{:03d}<br><br><a href=\"{}\" target=\"_blank\">《{}》<br></a></div>".format(res[idx],idx+1,df.loc[idx,"影片链接"],df.loc[idx,"影片中文名称"]))
    print("</div>")

再最后,将自动生成的代码复制到 HTML 的 64~66 行即可。

这是 页面展示

5. 后续

可以加入js使区块的颜色切换并保存,加入统计,。
加入响应式等,小屏体验不好

不过,应该没啥后续了,

前端其实挺有趣的,看着自己一个盒子一个盒子敲出来,然后对着几个样例网站更改样式,不会的属性去搜一下。
做完之后挺有成就感的。

6. 后续1

2021-11-04

改进:

  • 从 ipynb 改到 py
  • 加入进度条
  • json数据持久化
  • 命令行交互体验提升
  • tooltip 显示影片短评

1. 创建虚拟环境

在项目文件夹下运行:

py -m venv env

即可在该文件夹下生成一个名为 env 的虚拟环境,方便后续的 freeze 以及依赖管理

然后激活虚拟环境,并安装相关依赖:

cd env/Scripts
activate

pip install pandas
pip install bs4
pip install tqdm

2. 代码结构

开源地址

3. 导出依赖

pip freeze>requirements.txt

发布后使用者需进行的操作:

pip install -r requirements.txt

文章作者: ╯晓~
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ╯晓~ !
评论
  目录