豆瓣电影top250网页爬虫

news2024/10/23 2:44:56

设计思路

  1. 选择技术栈:确定使用Python及其相关库,如requests用于发送网络请求,获取网址,用re(正则表达式)或BeautifulSoup用于页面内容解析。
  2. 设计流程:规划爬虫的基本流程,包括发起请求、接受响应、解析内容、存储数据等环节。
  3. 模块设计:本设计用了4大模块,包括主体模块、爬取网页数据模块、获取网页数据模块以及保存数据模块。
  4. 错误处理:设计对网络请求错误(如连接超时、服务器错误等)的处理机制,确保程序的稳定

实现过程

       首先打开想要爬取的网页,然后定义了存储数据的文件路径,如果这个网页不能爬取,要写一个反爬取的,通过设置请求头和合理的访问间隔来解决,在网络中找到’User-Agent’的请求头,就能破解较为简单的发爬虫机制了。然后导入相关的库,再创建了一个爬取网页数据的geturl函数,写入发爬取的请求头和使用requests库并设置合适的请求体向目标网页发送请求,在这个函数里写入错误处理的代码,如果请求过程中出现异常,会打印出错误信息并返回空值。其次,定义了获取数据的getdata函数,通过BeautifulSoup解析数据,从获取到的网页内容中提取想要的内容。然后定义一个保存数据的savedata函数,将数据保存到想要保存的地方,最后调用主体函数,完成网页爬取过程。

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


def main():
    baseurl = "https://movie.douban.com/top250?start="
    datalist = getdata(baseurl)
    savepath = ".\\豆瓣电影top250.xls"
    savedata(datalist, savepath)





##获取网页数据
def getdata(baseurl):
    id = 0
    # 存储数据列表
    datalist = []
    ##豆瓣页面上一共有十页信息,一页爬取完成后继续下一页
    for i in range(0, 10):
        url = baseurl + str(i * 25)
        html = geturl(url)
        # 构建了一个BeautifulSoup类型的对象soup,是解析html的
        # html.parser是解析html的
        soup = BeautifulSoup(html, "html.parser")
        # 获取数据
        movie_items = soup.find_all("div", class_='item')
        for item in movie_items:
            id += 1
            # 保存HTML中一部电影的所有信息
            data = []
            # 获取文字
            title = item.select_one('.title').text
            # print(title)
            # 将那段文字分成列表
            time_data = item.select('.bd p')[0].text.split('\n')
            # print(time_data)
            # 将时间挑选出来
            time = time_data[2].replace(' ', '').split('/')[0]
            # print(time)
            # 将国家挑选出来
            country = time_data[2].replace(' ', '').split('/')[1]
            # print(country)
            # 酱想要的内容追加到数据中
            data.append(id)
            data.append(title)
            data.append(time)
            data.append(country)
            # 讲各部电影的信息存储在数据列表中
            datalist.append(data)
    return datalist


##保存数据
def savedata(datalist, savepath):
    workbook = xlwt.Workbook(encoding="utf-8", style_compression=0)  ##style_compression=0不压缩
    worksheet = workbook.add_sheet("豆瓣电影top250", cell_overwrite_ok=True)  # cell_overwrite_ok=True再次写入数据覆盖
    column = ("排名", "电影名", "时间", "国家")  ##execl项目栏
    for i in range(0, 4):
        worksheet.write(0, i, column[i])  # 将column[i]的内容保存在第0行,第i列
    for i in range(0, 250):
        data = datalist[i]
        for j in range(0, 4):
            worksheet.write(i + 1, j, data[j])
    workbook.save(savepath)


##爬取网页
def geturl(url):
    # 破解反爬虫
    head = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                      "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36"
    }
    req = urllib.request.Request(url, headers=head)
    try:  ##异常检测
        response = urllib.request.urlopen(req)
        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


# 提示文字并执行
if __name__ == '__main__':
    main()
    print("爬取成功!!!")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1844156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CCF推荐会议必投攻略:这些顶级会议投完直通录取大门

CCF推荐会议必投攻略:这些顶级会议投完直通录取大门! 会议之眼 快讯 CCF介绍 CCF(China Computer Federation)即中国计算机学会,前身是中国电子学会计算机专业委员会,成立于1962年。这是由从事计算机及相…

容器基本概念_从虚拟化技术_到容器化技术_开通青云服务器_并远程连接_容器安装---分布式云原生部署架构搭建007

这一部分,属于以前都会用到的,会快速过一遍,对于关键技术问题会加以说明 https://www.yuque.com/leifengyang/oncloud文档地址在这里,可以看,有些命令可以复制使用 可以看到容器的出现就是 目的就是,让你做的所有的软件,都可以一键部署启动 打包就是docker build 然后: 对于…

Github生成Personal access tokens及在git中使用

目录 生成Token 使用Token-手工修改 使用Token-自动 生成Token 登录GitHub,在GitHub右上角点击个人资料头像,点击Settings → Developer Settings → Personal access tokens (classic)。 在界面上选择点击【Generate new token】,填写如…

ctfshow web七夕杯

web签到 执行命令没有回显&#xff0c;我们直接写文件就可以了 有字符长度限制 ls />a nl /*>a访问url/api/a下载文件 easy_calc <?phpif(check($code)){eval($result."$code".";");echo($result); }function check(&$code){$num1…

Python-gui开发之Pycharm+pyside6/Pyqt6环境搭建

Python-gui开发之Pycharm+pyside6/Pyqt6环境搭建 软件版本一、软件安装1、Python安装2、Pycharm安装3、pyside6或pyqt6安装①安装pyside6②安装PyQt6和pyqt6-tools二、Pycharm项目配置1、插件安装2、新建项目以及环境配置3、包管理安装三、在Pycharm中配置PySide61、pyside6 Qt…

Redis持久化主从哨兵分片集群

文章目录 1. 单点Redis的问题数据丢失问题并发能力问题故障恢复问题存储能力问题 2. Redis持久化 -> 数据丢失问题RDB持久化linux单机安装Redis步骤RDB持久化与恢复示例RDB机制RDB配置示例RDB的fork原理总结 AOF持久化AOF配置示例AOF文件重写RDB与AOF对比 3. Redis主从 ->…

C/C++ struct stat介绍

目录 前言 struct stat struct stat 使用 参考 共勉 前言 本文详细介绍了stat结构体的成员变量&#xff0c;以及使用案例&#xff0c;希望能够帮到您。 struct stat struct stat 结构体用于表示文件或者文件系统对象信息的一种结构体的声明&#xff0c;通常在POSIX&#x…

Gobject tutorial 八

The GObject base class Object memory management Gobject的内存管理相关的API很复杂&#xff0c;但其目标是提供一个基于引用计数的灵活的内存管理模式。 下面我们来介绍一下&#xff0c;与管理引用计数相关的函数。 Reference Count 函数g_object_ref和g_object_unref的…

基于JSP的个人交友网站系统

开头语&#xff1a; 你好&#xff0c;我是计算机学长猫哥。在这个信息时代&#xff0c;个人交友网站为我们提供了一个便捷的社交平台。如果你对本系统感兴趣或有更多需求&#xff0c;欢迎联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技…

多线程(Lock锁,死锁,等待唤醒机制,阻塞队列,线程池)

Lock锁 虽然我们可以理解同步代码块和同步方法的锁对象问题但是我们并没有直接看到在哪里加上了锁&#xff0c;在哪里释放了锁为了更清晰的表达如何加锁和释放锁&#xff0c;JDK5以后提供了一个新的锁对象Lock Lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定操…

网络编程(七)网络超时检测

文章目录 一、概念二、实现方式&#xff08;一&#xff09; 使用select实现超时检测1. select函数补充说明&#xff1a;2. 使用示例3. 输出结果 &#xff08;二&#xff09; 使用setsockopt函数1. 函数定义2. 获取发送缓冲区和接收缓冲区的大小3. 端口复用4. 设置超时时间 &…

每日复盘-202406020

今日关注&#xff1a; 20240620 六日涨幅最大: ------1--------300462--------- 华铭智能 五日涨幅最大: ------1--------300462--------- 华铭智能 四日涨幅最大: ------1--------300462--------- 华铭智能 三日涨幅最大: ------1--------300462--------- 华铭智能 二日涨幅最…

华为数通企业面试笔试实验题

1. 笔试题 1.1 实验拓扑 1.2 实验要求 公司A为小型销售公司,需要实现基本上网功能,蓝色部分为外网线,提供DHCP服务 DnsServer:114.114.114.114 帮助网管排查某一台计算机在某一台交换机的某个端口 2. 操作步骤 配置路由器相关的LAN侧接口IP地址 配置DHCP项,要求有PC1与PC2…

关于椭圆的方程(有Python画的动图)

关于椭圆的方程&#xff08;有Python画的动图&#xff09; flyfish 几何定义 椭圆是平面上所有到两个固定点&#xff08;焦点&#xff09;的距离之和为常数的点的集合。这两个固定点叫做焦点。 解析几何描述 设椭圆的两个焦点为 F 1 F_1 F1​ 和 F 2 F_2 F2​&#xff…

Redis学习|Redis主从复制、Redis哨兵模式、缓存穿透、缓存击穿、缓存雪崩概念和相应解决方法

Redis主从复制 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(master/leader)&#xff0c;后者称为从节点(slave/follower);数据的复制是单向的&#xff0c;只能由主节点到从节点。Master以写为主&#xff0c;Slave 以…

深度解读:如何运用600+标签精准构建企业画像、快速筛选高价值企业?

启信慧眼-启信宝企业版 近年来&#xff0c;信息安全越来越得到企业与公众的重视&#xff0c;数据库作为数据基础设施的关键部件&#xff0c;是保障关键信息基础设施安全的重要前提。数据库不仅为企业提供了数据存储和管理的基础设施&#xff0c;还通过数据分析、优化和扩展等功…

php反序列化的一些知识

问题 <?php $raw O:1:"A":1:{s:1:"a";s:1:"b";}; echo serialize(unserialize($raw)); //O:1:"A":1:{s:1:"a";s:1:"b";}?> php反序列化的时按理说找不到A这个类&#xff0c;但是他没有报错&#xff0c;…

conda install xformers -c xformers/label/dev 的安装问题

在StableSR项目框架中&#xff0c;需要执行 conda install xformers -c xformers/label/dev 但是报错&#xff0c;错误显示&#xff0c;版本不匹配&#xff0c;如下所示&#xff1a; 我改用pip来安装&#xff0c;好像就不报错了&#xff1a; pip install xformers

Django使用django-apscheduler实现定时任务

定时任务可以在后台定时执行指定的代码&#xff0c;避免了很多人为操作。下面是在Django项目中如何使用定时任务的具体操作流程。 我在这里使用的 django-apscheduler库来实现定时任务。 一、安装 django-apscheduler pip install django-apscheduler二、在项目的setting.py…

vivado TIMING_PATH

描述 定时路径由设计元素之间的连接来定义。在数字中 在设计中&#xff0c;时序路径是由一对受其控制的顺序元件形成的 或者通过两个不同的时钟来启动和捕获信号。 在典型的定时路径中&#xff0c;数据在一个内的两个连续单元之间传输 时钟周期。例如&#xff0c;启动边缘发生在…