数据分析实战45讲
陈旸
清华大学计算机博士
立即订阅
17179 人已学习
课程目录
已完结 48 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你为什么需要数据分析能力?
免费
第一模块:数据分析基础篇 (16讲)
01丨数据分析全景图及修炼指南
02丨学习数据挖掘的最佳路径是什么?
03丨Python基础语法:开始你的Python之旅
04丨Python科学计算:用NumPy快速处理数据
05丨Python科学计算:Pandas
06 | 学数据分析要掌握哪些基本概念?
07 | 用户画像:标签化就是数据的抽象能力
08 | 数据采集:如何自动化采集数据?
09丨数据采集:如何用八爪鱼采集微博上的“D&G”评论
10丨Python爬虫:如何自动化下载王祖贤海报?
11 | 数据科学家80%时间都花费在了这些清洗任务上?
免费
12 | 数据集成:这些大号一共20亿粉丝?
13 | 数据变换:考试成绩要求正态分布合理么?
14丨数据可视化:掌握数据领域的万金油技能
15丨一次学会Python数据可视化的10种技能
16丨数据分析基础篇答疑
第二模块:数据分析算法篇 (20讲)
17 丨决策树(上):要不要去打篮球?决策树来告诉你
18丨决策树(中):CART,一棵是回归树,另一棵是分类树
19丨决策树(下):泰坦尼克乘客生存预测
20丨朴素贝叶斯分类(上):如何让机器判断男女?
21丨朴素贝叶斯分类(下):如何对文档进行分类?
22丨SVM(上):如何用一根棍子将蓝红两色球分开?
23丨SVM(下):如何进行乳腺癌检测?
24丨KNN(上):如何根据打斗和接吻次数来划分电影类型?
25丨KNN(下):如何对手写数字进行识别?
26丨K-Means(上):如何给20支亚洲球队做聚类?
27丨K-Means(下):如何使用K-Means对图像进行分割?
28丨EM聚类(上):如何将一份菜等分给两个人?
29丨EM聚类(下):用EM算法对王者荣耀英雄进行划分
30丨关联规则挖掘(上):如何用Apriori发现用户购物规则?
31丨关联规则挖掘(下):导演如何选择演员?
32丨PageRank(上):搞懂Google的PageRank算法
33丨PageRank(下):分析希拉里邮件中的人物关系
34丨AdaBoost(上):如何使用AdaBoost提升分类器性能?
35丨AdaBoost(下):如何使用AdaBoost对房价进行预测?
36丨数据分析算法篇答疑
第三模块:数据分析实战篇 (7讲)
37丨数据采集实战:如何自动化运营微博?
38丨数据可视化实战:如何给毛不易的歌曲做词云展示?
39丨数据挖掘实战(1):信用卡违约率分析
40丨数据挖掘实战(2):信用卡诈骗分析
41丨数据挖掘实战(3):如何对比特币走势进行预测?
42丨当我们谈深度学习的时候,我们都在谈什么?
43丨深度学习(下):如何用Keras搭建深度学习网络做手写数字识别?
第四模块:数据分析工作篇 (2讲)
44丨如何培养你的数据分析思维?
45丨求职简历中没有相关项目经验,怎么办?
加餐 (1讲)
加餐丨在社交网络上刷粉刷量,技术上是如何实现的?
结束语 (1讲)
结束语丨当大家都在讲知识和工具的时候,我更希望你重视思维和实战
数据分析实战45讲
登录|注册

10丨Python爬虫:如何自动化下载王祖贤海报?

陈旸 2019-01-04
上一讲中我给你讲了如何使用八爪鱼采集数据,对于数据采集刚刚入门的人来说,像八爪鱼这种可视化的采集是一种非常好的方式。它最大的优点就是上手速度快,当然也存在一些问题,比如运行速度慢、可控性差等。
相比之下,爬虫可以很好地避免这些问题,今天我来分享下如何通过编写爬虫抓取数据。

爬虫的流程

相信你对“爬虫”这个词已经非常熟悉了,爬虫实际上是用浏览器访问的方式模拟了访问网站的过程,整个过程包括三个阶段:打开网页、提取数据和保存数据。
在 Python 中,这三个阶段都有对应的工具可以使用。
在“打开网页”这一步骤中,可以使用 Requests 访问页面,得到服务器返回给我们的数据,这里包括 HTML 页面以及 JSON 数据。
在“提取数据”这一步骤中,主要用到了两个工具。针对 HTML 页面,可以使用 XPath 进行元素定位,提取数据;针对 JSON 数据,可以使用 JSON 进行解析。
在最后一步“保存数据”中,我们可以使用 Pandas 保存数据,最后导出 CSV 文件。
下面我来分别介绍下这些工具的使用。
Requests 访问页面
Requests 是 Python HTTP 的客户端库,编写爬虫的时候都会用到,编写起来也很简单。它有两种访问方式:Get 和 Post。这两者最直观的区别就是:Get 把参数包含在 url 中,而 Post 通过 request body 来传递参数。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《数据分析实战45讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(77)

  • rOMEo罗密欧
    老师请问一下:如果是需要用户登陆后才能爬取的数据该怎么用python来实现呢?

    作者回复: 你可以使用python+selenium的方式完成账户的自动登录,因为selenium是个自动化测试的框架,使用selenium 的webdriver就可以模拟浏览器的行为。找到输入用户名密码的地方,输入相应的值,然后模拟点击即可完成登录(没有验证码的情况下)
    另外你也可以使用cookie来登录网站,方法是你登录网站时,先保存网站的cookie,然后用下次访问的时候,加载之前保存的cookie,放到request headers中,这样就不需要再登录网站了

    2019-01-04
    1
    31
  • 说明两点问题:
    (一).留言里有人评论说用XPath下载的图片打不开,其原因是定义的下载函数保存路径后缀名为'.jpg',但是用XPath下载获得的图片url为'https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p616.webp',本身图片为webp格式,所以若保存为jpg格式,肯定是打不开的。
    (二). 老师在文章内讲的用XPath下载代码只能下载第一页的内容,并不是全部的数据,不知道大家有没有查看用xpath函数获得的数组,大家留言里的代码似乎和老师的一样,只能得到首页的内容,所以也是需要模拟翻页操作才能获得完整的数据。

    以下是课后练习题:爬取宫崎骏的电影海报, Python3.6 IDLE
    >>> import json
    >>> import requests as req
    >>> from lxml import etree
    >>> from selenium import webdriver
    >>> import os
    >>> request_url = 'https://movie.douban.com/subject_search?search_text=宫崎骏&cat=1002'
    >>> src_xpath = "//div[@class='item-root']/a[@class='cover-link']/img[@class='cover']/@src"
    >>> title_xpath = "//div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']"
    >>> driver = webdriver.Chrome('/Users/apple/Downloads/chromedriver')
    >>> driver.get(request_url)
    >>> html = etree.HTML(driver.page_source)
    >>> srcs = html.xpath(src_xpath)
    >>> print (srcs) #大家可要看下打印出来的数据是否只是一页的内容,以及图片url的后缀格式
    >>> picpath = '/Users/apple/Downloads/宫崎骏电影海报'
    >>> if not os.path.isdir(picpath):
    os.mkdir(picpath)
    >>> def download(src, id):
    dic = picpath + '/' + str(id) + '.webp'
    try:
    pic = req.get(src, timeout = 30)
    fp = open(dic, 'wb')
    fp.write(pic.content)
    fp.close()
    except req.exceptions.ConnectionError:
    print ('图片无法下载')
    >>> for i in range(0, 150, 15):
    url = request_url + '&start=' + str(i)
    driver.get(url)
    html = etree.HTML(driver.page_source)
    srcs = html.xpath(src_xpath)
    titles = html.xpath(title_xpath)
    for src,title in zip(srcs, titles):
    download(src, title.text)
    2019-04-10
    24
  • caidy
    你需要使用浏览器的插件查看 XHR 数据,比如在 Chrome的开发者工具
    在豆瓣搜索中,我们对“王祖贤”进行了模拟,发现 XHR 数据中有一个请求是这样的:
    https://www.douban.com/j/search_photo?q=王祖贤&limit=20&start=0

    这个是如何查出来的,我使用chrome的开发者工具查看,但是查不到这部分,麻烦老师帮忙解答
    2019-01-05
    3
    12
  • 伪君子
    那些用 ChromeDriver 的出现报错的可能是没有安装 ChromeDriver,或者是没给出 ChromeDriver 的路径,具体可以看看下面这篇文章。
    https://mp.weixin.qq.com/s/UL0bcLr3KOb-qpI9oegaIQ

    作者回复: 对的,主要是配置ChromeDriver的问题。有相同问题的人,可以看下这个留言

    2019-01-04
    11
  • LY
    #环境:Mac Python3
    #pip install selenium
    #下载chromedriver,放到项目路径下(https://npm.taobao.org/mirrors/chromedriver/2.33/)
    # coding:utf-8
    import requests
    import json
    import os
    from lxml import etree
    from selenium import webdriver

    query = '张柏芝'
    downloadPath = '/Users/yong/Desktop/Python/xpath/images/'

    ''' 下载图片 '''
    def download(src, id):
        dir = downloadPath + str(id) + '.jpg'
        try:
            pic = requests.get(src, timeout=10)
        except requests.exceptions.ConnectionError:
        # print 'error, %d 当前图片无法下载', %id
            print('图片无法下载')
        if not os.path.exists(downloadPath):
            os.mkdir(downloadPath)
        if os.path.exists(dir):
            print('已存在:'+ id)
            return
        fp = open(dir, 'wb')
        fp.write(pic.content)
        fp.close()
     
    def searchImages():
        ''' for 循环 请求全部的 url '''
        for i in range(0, 22471, 20):
            url = 'https://www.douban.com/j/search_photo?q='+query+'&limit=20&start='+str(i)
            html = requests.get(url).text # 得到返回结果
            print('html:'+html)
            response = json.loads(html,encoding='utf-8') # 将 JSON 格式转换成 Python 对象
            for image in response['images']:
                print(image['src']) # 查看当前下载的图片网址
                download(image['src'], image['id']) # 下载一张图片

    def getMovieImages():
        url = 'https://movie.douban.com/subject_search?search_text='+ query +'&cat=1002'
        driver = webdriver.Chrome('/Users/yong/Desktop/Python/xpath/libs/chromedriver')
        driver.get(url)
        html = etree.HTML(driver.page_source)
        # 使用xpath helper, ctrl+shit+x 选中元素,如果要匹配全部,则需要修改query 表达式
        src_xpath = "//div[@class='item-root']/a[@class='cover-link']/img[@class='cover']/@src"
        title_xpath = "//div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']"

        srcs = html.xpath(src_xpath)
        titles = html.xpath(title_xpath)
        for src, title in zip(srcs, titles):
            print('\t'.join([str(src),str(title.text)]))
            download(src, title.text)

        driver.close()

    getMovieImages()

    作者回复: GoodJob

    2019-01-04
    6
  • 伪君子
    老师您好,我根据您的代码修改了一下,主要是添加了一个图片的目录,然后是下载大图。这里的大图是因为 /photo/thumb/public/ 这样的链接下载的图片是缩略图,只有把 thumb 替换成 l 之后下载的图片才是相对来说的大图。replace 方法和 re 中的 sub 方法都能实现替换,我的疑问是哪个实现起来更高速一点呢?提前感谢老师,我写的代码在下面~

    # coding:utf-8
    import requests
    import json
    import re
    import os

    query = '王祖贤'
    path = os.getcwd() # 当前路径,可以替换成别的路径
    picpath = path + '/' + query # 设置的图片目录
    print(picpath) # 输出设置的图片目录
    if not os.path.isdir(picpath): # 如果图片目录未创建则创建一个
        os.mkdir(picpath)


    def download(src, id):
        dir = picpath + '/' + str(id) + '.jpg'
        try:
            pic = requests.get(src, timeout=10)
        except requests.exceptions.ConnectionError:
            # print 'error, %d 当前图片无法下载', %id
            print('图片无法下载')
        fp = open(dir, 'wb')
        fp.write(pic.content)
        fp.close()


    ''' for 循环 请求全部的 url '''
    for i in range(0, 22471, 20): #
        url = 'https://www.douban.com/j/search_photo?q=' + query + '&limit=20&start=' + str(i)
        html = requests.get(url).text # 得到返回结果
        response = json.loads(html, encoding='utf-8') # 将 JSON 格式转换成 Python 对象
        print('已下载 ' + str(i) + ' 张图片')
        for image in response['images']:
            image['src'] = image['src'].replace('thumb', 'l')
            # image['src'] = re.sub(r'thumb', r'l', image['src'])
            print(image['src']) # 查看当前下载的图片网址
            download(image['src'], image['id']) # 下载一张图片
    2019-01-04
    5
  • germany
    老师:为什么我在豆瓣网查询图片的网址与你不一样?https://www.douban.com/search?cat=1025&q=王祖贤&source=suggest 。是什么原因?

    作者回复: 咱们访问豆瓣查询图片的网址应该是一样的。只是我给出的是json的链接。方法是:用Chrome浏览器的开发者工具,可以监测出来网页中是否有json数据的传输,所以我给出的链接是json数据传输的链接 https://www.douban.com/j/search_photo?q=%E7%8E%8B%E7%A5%96%E8%B4%A4&limit=20&start=0

    2019-01-04
    5
  • Bayes
    老师你这跳过了太多步骤了,表示对于python跟着你前几节课入门的人什么都不会,按着你的代码运行,要不就是没有定义,要不就是没有这个函数。刚开始的人也不知道哪个函数在哪个库,建议老师按照流程来一步一步给代码,要不就在最后给一个完整的代码示例,真的是学的很困难加上想放弃
    2019-07-30
    1
    4
  • 許敲敲
    要下载所有James 哈登的图片

    作者回复: NBA明星也是不错的选择

    2019-01-04
    4
  • juixv3937
    怎么查看XHR数据啊,操作步骤跳过的话,学习的很困难
    2019-04-22
    3
  • ldw
    可以用爬虫爬谷歌吗?会不会被当成恶意攻击?不会引来国际官司吧。
    2019-01-06
    2
  • Yezhiwei
    用Scrapy爬取数据更方便哈,请问老师怎么做一个通用的爬虫呢?比如要爬取文章标题和内容,不同的网站Xpath结构不一样,如果源少的话可以分别配置,但如果要爬取几百上千的网站数据,分别配置Xpath挺麻烦的。请问这个问题有什么解决方案吗?谢谢

    作者回复: 网站的抓取和网页的HTML结构有很大关系,所以一般都是用XPath解析,如果你用第三方工具,比如八爪鱼,也是要个性化的把每个网站流程模拟出来,这样工具会自动定位XPath
    网站的抓取和网页的HTML结构有很大关系,所以一般都是用XPath解析,如果你用第三方工具,比如八爪鱼,也是要个性化的把每个网站流程模拟出来,这样工具会自动定位XPath
    如果想要做一个通用的解决方案,自动识别文章的标题和内容。就需要先把HTML下载下来,然后将HTML解析为DOM树,再对每个节点做评估(文章标题还是内容的可能性)
    这样做的好处是通用性强,缺点就是可能会出错。

    2019-01-04
    2
  • qinggeouye
    https://github.com/qinggeouye/GeekTime/blob/master/DataAnalysis/10_crawl_xpath.py

    import os
    import requests
    from lxml import etree
    from selenium import webdriver

    search_text = '王祖贤'
    start = 0 # 请求 url 的 start 从 0 开始,每一页间隔 15,有 6 页
    total = 90
    limit = 15

    # 电影海报图片地址
    src_xpath = "//div[@class='item-root']/a[@class='cover-link']/img[@class='cover']/@src"
    # 电影海报图片title
    title_xpath = "//div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']"

    # 保存目录
    pic_path = '10/xpath' # 相对目录
    # WebDriver 创建一个 Chrome 浏览器的 drive
    driver = webdriver.Chrome('./chromedriver') # MAC 版本


    # 创建图片保存路径
    def mk_save_path(pic_path_):
        if not os.path.exists(pic_path_):
            os.makedirs(pic_path_)
        return os.getcwd() + '/' + pic_path_ + '/'


    # 下载图片
    def download(src, pic_id, save_path_):
        directory = save_path_ + str(pic_id) + '.jpg'
        try:
            pic = requests.get(src, timeout=10)
            fp = open(directory, 'wb')
            fp.write(pic.content)
            fp.close()
        except requests.exceptions.ConnectionError:
            print('图片如无法下载')


    def get_response_xpath():
        save_path = mk_save_path(pic_path)
        for i in range(start, total, limit):
            requests_url = 'https://search.douban.com/movie/subject_search?search_text=' + search_text + '&cat=1002' + \
                           '&start=' + str(i)
            driver.get(url=requests_url)
            html = etree.HTML(driver.page_source)
            src_list = html.xpath(src_xpath)
            title_list = html.xpath(title_xpath)
            for src, title in zip(src_list, title_list):
                download(src, title.text, save_path)


    if __name__ == '__main__':
        get_response_xpath()
    2019-11-06
    1
  • qinggeouye
    https://github.com/qinggeouye/GeekTime/blob/master/DataAnalysis/10_crawl.py

    # coding: utf-8
    import os

    import requests
    import json


    # 下载图片
    def download(src, pic_id, save_path_):
        directory = save_path_ + str(pic_id) + '.jpg'

        try:
            pic = requests.get(src, timeout=10)
            fp = open(directory, 'wb')
            fp.write(pic.content)
            fp.close()
        except requests.exceptions.ConnectionError:
            print('图片如无法下载')


    # 获取返回页面内容
    def get_resp(query_, limit_, start_):
        url_ = 'https://www.douban.com/j/search_photo?q=' + query_ + '&limit=' + str(limit_) + '&start=' + str(start_)
        html_ = requests.get(url_).text # 得到返回结果
        response_ = json.loads(html_, encoding='utf-8') # 将 JSON 格式转换为 Python 对象
        return response_


    query = '王祖贤'
    limit = 20
    start = 0

    ''' 获取图片总数量 '''
    total = get_resp(query, limit, start)['total']
    print(total)

    pic_path = '10' # 相对目录
    if not os.path.exists(pic_path):
        os.mkdir(pic_path)
    save_path = os.getcwd() + '/' + pic_path + '/'

    # 循环 请求全部的 url
    for i in range(start, total, limit):
        response = get_resp(query, limit, i)
        for image in response['images']:
            print(image['src']) # 查看当前下载的图片地址
            download(image['src'], image['id'], save_path) # 下载一张图片
    2019-11-05
    1
    1
  • 图·美克尔
    我更喜欢用bs4美味汤
    2019-07-17
    1
  • 白色纯度
    网址:豆瓣电影;任务:批量下载赵丽颖电影海报(支持翻页,自定义终止下载量);python3.X;
    浏览器:Google Chrome ;唯一要注意的是webdriver的路径。全都是这门课程里面的知识点
    # -*- coding: utf-8 -*-
    import requests
    from lxml import etree
    from selenium import webdriver
    import os

    name = '赵丽颖'

    def download(src, id):
        if not os.path.isdir("Xpath的翻页图片包"):
            os.mkdir("Xpath的翻页图片包")
        dir = os.path.join("Xpath的翻页图片包/", str(id) + '.webp')
        try:
            pic = requests.get(src, timeout = 10)
            with open(dir, 'wb') as d:
                d.write(pic.content)
        except requests.exceptions.ConnectionError:
            print("图片无法下载")

    def down_load(request_url):
        driver.get(request_url)
        html = etree.HTML(driver.page_source)
        src_xpath = "//div[@class='item-root']/a[@class='cover-link']/img[@class='cover']/@src"
        title_xpath = "//div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']"
        srcs = html.xpath(src_xpath)


        titles = html.xpath(title_xpath)
        num = len(srcs)
        if num > 15:
            srcs = srcs[1:]
            titles = titles[1:]

        for src, title in zip(srcs, titles):
            if title is None:
                continue
            print(src)
            download(src, title.text)
        print('OK')
        print(num)
        if num >= 1:
            return True
        else:
            return False

    if __name__ == '__main__':
        requests_url = "https://movie.douban.com/subject_search?search_text=" + name
        driver = webdriver.Chrome(executable_path=r'C:\Users\XXX\AppData\Local\Google\Chrome\Application\chromedriver.exe')
        driver.get(requests_url)
        html = etree.HTML(driver.page_source)
        print(html)

        base_url = 'https://movie.douban.com/subject_search?search_text=' + name + '&cat=1002&start='
        start = 0
        while start < 70:
            request_url = base_url + str(start)
            flag = down_load(request_url)
            if flag:
                start += 15
            else:
                break
        print("结束")
    2019-06-23
    1
  • Wing·三金
    练习内容:使用 XPath 下载宫崎骏相关的电影海报!!!

    源码如下:
    ''' To download all pages '''

    ### use webdriver to simulate page loading
    from selenium import webdriver
    import requests
    from lxml import etree
    import pyprind
    import time
    import re

    def download_pics(src, p_id):
        ''' 下载指定图片 '''
        
        save_dir = 'pics/'
        if isinstance(p_id, str):
            # 过滤非法的文件名符号
            p_id = re.sub(r'[\\/:?|*]+', ' ', p_id)
            save_dir += p_id + '.jpg'
        else:
            save_dir += str(p_id) + '.jpg'
        try:
            pic = requests.get(src, timeout=10)
            with open(save_dir, 'wb') as fout:
                fout.write(pic.content)
        except requests.exceptions.ConnectionError:
            print('无法连接到图片 %d' % p_id)

        return True

    request_url = "https://movie.douban.com/subject_search?search_text=%E5%AE%AB%E5%B4%8E%E9%AA%8F&cat=1002"
    driver = webdriver.Chrome()

    # 通过观察不同页码下的网页地址,大概有140个搜索结果
    for i in range(0, 136, 15):
        driver.get(request_url + "&start=" + str(i))
        driver.implicitly_wait(10)
        # 一个小小的防被封 IP 措施
        time.sleep(3)

        html = driver.execute_script("return document.documentElement.outerHTML")
        # html = requests.get(request_url).text
        html = etree.HTML(html)

        src_xpath = "//div[@class='item-root']/a/img/@src"
        title_xpath = "//div/div/div/a[@class='title-text']"
        srcs = html.xpath(src_xpath)
        titles = html.xpath(title_xpath)

        # 一个用来显示进度百分数的包
        pper = pyprind.ProgPercent(len(srcs))
        for src, title in zip(srcs, titles):
            download_pics(src, title.text)
            pper.update()
    2019-06-17
    1
  • chitanda
    分享一个可以在专题页面下载茅野爱衣缩略图的脚本,src_xpath = "//img[@class='']/@src"中的class='' 让我搞了半天,至今不知道为什么不存在class name时必须加一句class='',下面是代码
    import os
    import uuid

    from lxml import etree

    import requests


    def download(src, name=None):
        if not name:
            name = uuid.uuid1()
        if not os.path.isdir('Kayano'):
            os.mkdir('Kayano')
        adir = os.path.join('Kayano/', str(name) + '.jpg')
        try:
            pic = requests.get(src, timeout=10)
            with open(adir, 'wb') as f:
                f.write(pic.content)
        except requests.exceptions.ConnectionError:
            print('图片无法下载')


    if __name__ == '__main__':
        
        from selenium import webdriver
        
        request_url = 'https://movie.douban.com/celebrity/1314532/photos/'
        driver = webdriver.Chrome(executable_path='chromedriver.exe')
        driver.get(request_url)
        html = etree.HTML(driver.page_source)
        
        src_xpath = "//img[@class='']/@src"
        srcs = html.xpath(src_xpath)
        for src in srcs:
            download(src)
    2019-04-11
    1
  • 爱喝酸奶的程序员
    有个问题selenium,是用来自动化测试的,他回打开浏览器……我做爬虫是不想让代码打开浏览器,只想要他爬取的动作~要怎么办呢?
    2019-02-26
    1
  • 王彬成
    在讲解“如何使用 XPath 自动下载王祖贤的电影海报封面”的内容时,希望能给出完整的代码块。因为感觉很凌乱,不知如何下手。
    看了留言中的代码块,下载下来的海报文件也无法打开
    2019-02-12
    1
收起评论
77
返回
顶部