首页 > 编程语言 >[代码改进]python爬虫实践——爬取“豆瓣top250”

[代码改进]python爬虫实践——爬取“豆瓣top250”

时间:2022-12-30 11:57:30浏览次数:69  
标签:douban python movie 电影 爬取 url separator top250

参考了别人的blog,不过原文的bug实在有点多,输出的文件样式也不友好,对其进行了优化、debug、测试,重新发布。

ps:测试频率要注意,太频繁会被封IP =、=

原文:
https://www.cnblogs.com/lweiser/p/11042658.html#5136708

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
主页:
    https://movie.douban.com/top250
    GET
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36

re正则:
    # PS: 电影详情页url、图片链接、电影名称、导演、电影上映时间、电影评分、评价人数
    #     因为有的电影信息不全,所以正则不再获取主演和简介信息。
     '<div class="item">.*?<em class="">(.*?)</em>.*?href="(.*?)">.*?src="(.*?)" class="">.*?<span class="title">(.*?)</span>.*?<div class="bd">.*?导演:(.*?)\&nbsp;.*?<br>(.*?)\&nbsp;.*?</p>.*?<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价',
"""
"""
每一页URL:
第一页:https://movie.douban.com/top250
第二页:https://movie.douban.com/top250?start=25&filter=
第三页:https://movie.douban.com/top250?start=50&filter=
.....
第九页:https://movie.douban.com/top250?start=200&filter=
第十页:https://movie.douban.com/top250?start=225&filter=
"""

import requests
import re
import random, time


def get250Mov():
    # 请求头
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3770.90 Safari/537.36"
    }

    base_url = "https://movie.douban.com/top250?start={}&filter="

    file_name = "douban.csv"
    separator = "\t,"  # wps貌似只支持,作为csv的分隔符 =。=
    start_num = 0

    # 表头
    with open(file_name, "w", encoding="utf-8") as f:
        f.write("")
        f.write(
            f"序号{separator}电影名称{separator}导演{separator}电影上映时间{separator}电影评分{separator}评价人数{separator}电影url{separator}图片链接\n"
        )

    for i in range(10):
        url = base_url.format(start_num)
        start_num += 25
        # print("测试:======", url)

        # 1、往豆瓣发送请求
        response = requests.get(url, headers=headers)

        # 2、通过正则解析提取数据
        # PS: 电影详情页url、图片链接、电影名称、导演、电影上映时间、电影评分、评价人数
        #   暂不支持抓“简介”,有的电影没有简介,用正则捕获会有异常
        movie_content_list = re.findall(
            '<div class="item">.*?<em class="">(.*?)</em>.*?href="(.*?)">.*?src="(.*?)" class="">.*?'
            '<span class="title">(.*?)</span>.*?<div class="bd">.*?导演:(.*?)[&nbsp;].*?<br>(.*?)&nbsp;.*?</p>.*?'
            '<span class="rating_num".*?>(.*?)</span>.*?<span>(.*?)人评价',
            response.text,
            re.S,
        )

        # 解压赋值每一部电影
        for move_content in movie_content_list:
            (
                class_no,
                detail_url,
                image_url,
                movie_name,
                director,
                movie_time,
                movie_grade,
                number,
            ) = move_content
            detail_data = (
                f"{class_no}{separator}{movie_name}{separator}{trans(director)}{separator}{trans(movie_time)}"
                f"{separator} {movie_grade}{separator}{number}{separator}{detail_url}{separator}{image_url} \n"
            )

            # 保存数据
            with open(file_name, "a", encoding="utf-8") as f:
                f.write(detail_data)

        # print(detail_data)
        print("{}% completed.".format((i + 1) * 10))
        time.sleep(random.random() * 3)


def trans(s):
    return s.replace("&nbsp;", " ").strip()


if __name__ == "__main__":
    get250Mov()

标签:douban,python,movie,电影,爬取,url,separator,top250
From: https://www.cnblogs.com/joyer/p/17014523.html

相关文章

  • python的web应用程序开发(Django框架)
    python的web应用程序开发(Django框架)1.安装Django并开启网页服务器pipinstalldjango#安装Django包django-adminstartprojectmysite#在指定路径下新建一个mysite文件......
  • 基于Python的一个自动录入表格的小程序
    思路:第一步:信息还是要填的,以往是同学们发给班委,然后慢慢来搞,但现在不一样的,我要求同学们把他们要填的信息写在记事本里面,内容之间用中文逗号隔开,然后在发给我就行。第二......
  • 基于Python Numpy的数组array和矩阵matrix详解
    NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(通常是元素是数字)。在NumPy中维度(dimensions)叫做轴(axes)......
  • 读python代码-学到的python函数-2
    1.zip函数zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与......
  • python之xml基本操作
    1.概述XML(ExtensibleMarkupLanguage)中文译为可扩展标记语言,它是一种简单、灵活、易扩展的文本格式,它主要关注数据内容,常用来传送、存储数据。当通过XML来传送数据......
  • 浅析Python 实现一个自动化翻译和替换的工具
    浅析Python实现一个自动化翻译和替换的工具大家好我是毕加锁(锁!)这篇文章主要介绍了Python实现一个自动化翻译和替换的工具,非常不错,具有一定的参考借鉴价值,需要的朋友......
  • Python处理复杂的CSV文件
    目录​​大家好我是毕加索锁(锁!)今天教大家利用Python处理复杂的CSV文件​​​​项目简介​​​​项目笔记与心得​​​​总结​​ 大家好我是毕加索锁(锁!)今天教大家......
  • 利用Python制作本地Excel的查询与生成的程序
    目录​​前言​​​​需求​​​​实验步骤​​​​Excel预览图片​​​​查询​​​​追加查询结果到Excel​​​​完整代码​​前言大家好我是毕加锁(锁!)今天教大家利......
  • 锦囊秘籍!用Python操作MySQL的使用教程集锦!
    一.python操作数据库介绍大家好,我是毕加锁(锁!)。Python标准数据库接口为PythonDB-API,PythonDB-API为开发人员提供了数据库应用编程接口。Python数据库接口支持非常多的......
  • Python实现房产数据分析与可视化 数据分析 实战
    Python库的选择话说,工欲善其事,必先利其器,虽然我们已经选择Python来完成剩余的工作,但是我们需要考虑具体选择使用Pytho的哪些利器来帮助我们更快更好地完成剩余的工作。我们......