" name="sm-site-verification"/>
侧边栏壁纸
博主头像
PySuper博主等级

千里之行,始于足下

  • 累计撰写 203 篇文章
  • 累计创建 14 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Python 抓取豆瓣电影热门

PySuper
2020-10-16 / 0 评论 / 0 点赞 / 15 阅读 / 4578 字
温馨提示:
所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊

网页解析

![页面分析](http://qny.zhengxingtao.com/media/images/douban_1.png)

代码解析

类初始化

class DouBanMovie(object):
    def __init__(self):
        self.base_url = "https://movie.douban.com/"
        self.start_url = "https://movie.douban.com/j/search_subjects?type=movie&tag=%E6%9C%80%E6%96%B0&page_limit=20&page_start={}"
        self.header = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"}

获取URL列表

    def get_url_list(self, start_url):
        """
        通过初始URL,获取所有的URL列表
        :param start_url: 初始URL
        :return: 所有URL的列表
        """
        # 列表推导式
        # return [start_url.format(page * 20) for page in range(10)]

        # for循环
        url_list = []
        for page in range(10):
            url = start_url.format(page * 20)
            url_list.append(url)
        return url_list

获取网页

    def get_html(self, url, header):
        """
        根据每一个URL,获取它返回信息
        :param url: 单个URL请求的链接
        :return: 当前URL响应中的内容
        """
        response = requests.get(url, headers=header)
        response.encoding = response.apparent_encoding  # 编码
        if response.status_code == 200:
            return response.text

解析数据

    def parse_url(self, html):
        """
        拿到每个URL返回的信息之后,处理数据中的有用信息
        :param html: URL返回的信息
        :return: 每条数据中的有用信息
        """
        # 处理json数据
        items = []
        content = json.loads(html)
        for movie in content["subjects"]:
            item = {}
            item["电影"] = movie["title"]
            item["评分"] = movie["rate"]
            item["图片"] = movie["cover"]
            items.append(item)
        return items

存储数据

    def save(self, file, items):
        """
        拿到JSON数据之后,写入到CSV文件中
        :param items: 装有JSON数据的列表
        :return: 文件写入状态
        """
        try:
            # 写入csv文件
            with open(file, 'a+') as csv_save:
                field_name = ['电影', '评分', '图片']  # 表头
                writer = csv.DictWriter(csv_save, fieldnames=field_name)

                # 多行写入
                writer.writerows(items)

                # 单行写入
                # for item in items:
                #     writer.writerow(item)

            # 自动获取文件的绝对路径
            current_path = os.path.abspath(__file__)
            file_path = os.path.join(
                os.path.abspath(
                    os.path.dirname(current_path) + os.path.sep + "."
                ), file
            )
            return file_path
        except Exception as error:
            return error

运行逻辑

    def run_save(self, file_name):
        """
        整个类的代码逻辑
        :return:
        """
        url_list = self.get_url_list(self.start_url)
        for url in url_list:
            html = self.get_html(url, self.header)
            items = self.parse_url(html)
            self.save(file_name, items)

实例化对象

douban = DouBanMovie()
douban.run_save("douban.csv")
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区