Python爬虫实战—探索某网站电影排名

news2024/12/23 0:45:55

文章目录

  • Python爬虫实战—探索某网站电影排名
    • 准备工作
    • 编写爬虫代码
    • 代码解析
    • 运行情况截图
    • 进一步优化和说明
    • 完整代码
    • 总结

说明:本案例以XXX网站为例,已隐去具体网站名称与地址。

Python爬虫实战—探索某网站电影排名

网络爬虫是一种自动化程序,用于获取互联网上的信息。它们被广泛用于数据收集、搜索引擎和各种其他应用中。Python语言具有强大的网络爬虫库和工具,使得编写爬虫变得相对简单。在本文中,我们将介绍如何使用Python编写一个简单的网络爬虫,并以某网电影网站为例进行说明。

准备工作

首先,我们需要安装Python以及以下几个库:

  • requests:用于发送HTTP请求和获取响应。
  • lxml:用于解析HTML文档。
  • csv:用于将数据保存到CSV文件中。

你可以使用pip命令来安装这些库:

pip install requests lxml

编写爬虫代码

以下是一个简单的某网电影网站爬虫示例代码:

import requests
from lxml import etree
import csv
import time


class DoubanSpider(object):
    def __init__(self):
        self.header = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
        }

    # 发请求 获响应
    def get_source(self, com_url):
        res = requests.get(com_url, headers=self.header)
        html = res.content.decode('utf-8')
        return html

    # 解析数据
    def parsed_source(self, html):
        tree = etree.HTML(html)
        divs = tree.xpath('//div[@class="info"]')
        lis_data = []
        for div in divs:
            d = {}
            title = div.xpath('./div[@class="hd"]/a/span/text()')[0].strip()
            score = div.xpath('./div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0].strip()
            evaluate = div.xpath('./div[@class="bd"]/div[@class="star"]/span[last()]/text()')[0].strip()
            quote = div.xpath('./div[@class="bd"]/p[@class="quote"]/span/text()')
            quote = quote[0] if quote else ''
            link_url = div.xpath('./div[@class="hd"]/a/@href')[0].strip()
            d['title'] = title
            d['score'] = score
            d['evaluate'] = evaluate
            d['quote'] = quote
            d['link_url'] = link_url
            lis_data.append(d)
        return lis_data

    # 保存数据
    def save_source(self, move_data, header):
        with open('movie_data.csv', 'a', encoding='utf-8-sig', newline='') as f:
            w = csv.DictWriter(f, header)
            w.writerows(move_data)

    # 主函数
    def main(self):
        start = int(input('输入要爬取的起始页:'))
        end = int(input('输入要爬取的末尾页:'))
        for i in range(start, end+1):
            time.sleep(2)
            page = (i-1) * 25
            com_url = 'https://xxx/top250?start=' + str(page)
            h = self.get_source(com_url)
            print('爬虫机器人正在爬取第%d页' % i)
            move_data = self.parsed_source(h)
            header = ['title', 'score', 'evaluate', 'quote', 'link_url']
            self.save_source(move_data, header)


if __name__ == '__main__':
    Spider = DoubanSpider()
    Spider.main()

代码解析

  1. DoubanSpider

这是一个名为 DoubanSpider 的类,用于执行某网电影网站的爬取任务。

  1. 初始化方法 __init__()

在初始化方法中,我们设置了请求头,模拟了浏览器发送请求的行为。

  1. get_source() 方法

这个方法发送HTTP请求并获取响应内容。

  1. parsed_source() 方法

这个方法用于解析HTML内容,提取电影的相关信息,如标题、评分、评价人数、引用和链接URL。

  1. save_source() 方法

该方法用于将解析后的数据保存到CSV文件中。

  1. main() 方法

这是爬虫的主要逻辑。它接受用户输入的起始页和结束页,然后遍历每一页,调用其他方法执行爬取和保存数据的操作。

运行情况截图

image-20240320132159688

image-20240320132330959

进一步优化和说明

虽然以上代码可以完成基本的爬取任务,但还有一些优化和说明可以帮助提高代码的质量和可读性。

  1. 异常处理

在网络请求中,经常会出现各种异常情况,比如连接超时、请求失败等。为了增加代码的健壮性,可以添加异常处理机制。

try:
    res = requests.get(com_url, headers=self.header)
    res.raise_for_status()  # 检查请求是否成功
except requests.RequestException as e:
    print("请求异常:", e)
    return None
  1. 数据去重

在爬取数据时,可能会出现重复的电影信息。为了避免重复,可以在保存数据之前进行去重操作。

def save_source(self, move_data, header):
    # 去重
    move_data = self.remove_duplicates(move_data)
    with open('movie_data.csv', 'a', encoding='utf-8-sig', newline='') as f:
        w = csv.DictWriter(f, header)
        w.writerows(move_data)

def remove_duplicates(self, move_data):
    unique_data = []
    titles = set()
    for item in move_data:
        if item['title'] not in titles:
            unique_data.append(item)
            titles.add(item['title'])
    return unique_data
  1. 使用生成器优化内存占用

在爬取大量数据时,可能会占用大量内存。可以使用生成器来优化内存占用。

def parsed_source(self, html):
    tree = etree.HTML(html)
    divs = tree.xpath('//div[@class="info"]')
    for div in divs:
        d = {}
        title = div.xpath('./div[@class="hd"]/a/span/text()')[0].strip()
        score = div.xpath('./div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0].strip()
        evaluate = div.xpath('./div[@class="bd"]/div[@class="star"]/span[last()]/text()')[0].strip()
        quote = div.xpath('./div[@class="bd"]/p[@class="quote"]/span/text()')
        quote = quote[0] if quote else ''
        link_url = div.xpath('./div[@class="hd"]/a/@href')[0].strip()
        d['title'] = title
        d['score'] = score
        d['evaluate'] = evaluate
        d['quote'] = quote
        d['link_url'] = link_url
        yield d
  1. 添加用户代理池

为了避免被网站识别为爬虫程序而被封禁IP,可以使用代理池来切换IP地址。

  1. 日志记录

添加日志记录功能可以方便调试和追踪爬取过程中的问题。

  1. 数据存储方式

除了CSV文件,还可以考虑使用数据库(如SQLite、MySQL等)来存储爬取的数据,以支持更复杂的数据操作和查询。

  1. 用户交互改进

在用户与爬虫交互方面,可以考虑添加输入参数的方式来控制爬虫的行为,而不是每次都手动输入起始页和结束页。

import argparse

def parse_arguments():
    parser = argparse.ArgumentParser(description="某网电影Top250爬虫")
    parser.add_argument("--start", type=int, default=1, help="起始页码")
    parser.add_argument("--end", type=int, default=10, help="结束页码")
    return parser.parse_args()

def main(self):
    args = parse_arguments()
    start = args.start
    end = args.end
    for i in range(start, end+1):
        # 爬取逻辑不变

通过这种方式,用户可以在命令行中指定起始页和结束页,而不需要手动输入。

  1. 添加定时任务

如果需要定时执行爬虫任务,可以使用Python中的定时任务库(如APScheduler)来实现。

from apscheduler.schedulers.blocking import BlockingScheduler

def scheduled_task():
    Spider = DoubanSpider()
    Spider.main()

if __name__ == "__main__":
    scheduler = BlockingScheduler()
    scheduler.add_job(scheduled_task, "interval", minutes=60)  # 每隔60分钟执行一次
    scheduler.start()
  1. 添加单元测试

为了保证爬虫代码的稳定性和正确性,可以添加单元测试,验证爬虫函数的各个部分是否按照预期工作。

import unittest

class TestDoubanSpider(unittest.TestCase):
    def test_get_source(self):
        # 编写测试用例
    def test_parsed_source(self):
        # 编写测试用例
    def test_save_source(self):
        # 编写测试用例

if __name__ == '__main__':
    unittest.main()

完整代码

import requests  # 导入requests库,用于发送HTTP请求
from lxml import etree  # 导入etree模块,用于解析HTML文档
import csv  # 导入csv模块,用于读写CSV文件
import time  # 导入time模块,用于添加延时


class DoubanSpider(object):
    def __init__(self):
        # 初始化函数,设置请求头,模拟浏览器发送请求
        self.header = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'
        }

    # 发请求 获响应
    def get_source(self, com_url):
        # 发送HTTP请求并获取响应内容
        res = requests.get(com_url, headers=self.header)
        html = res.content.decode('utf-8')
        return html

    # 解析数据
    def parsed_source(self, html):
        # 解析HTML内容,提取电影相关信息
        tree = etree.HTML(html)
        divs = tree.xpath('//div[@class="info"]')
        lis_data = []
        for div in divs:
            d = {}
            # 提取标题
            title = div.xpath('./div[@class="hd"]/a/span/text()')[0].strip()
            # 提取评分
            score = div.xpath('./div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0].strip()
            # 提取评价人数
            evaluate = div.xpath('./div[@class="bd"]/div[@class="star"]/span[last()]/text()')[0].strip()
            # 提取引用
            quote = div.xpath('./div[@class="bd"]/p[@class="quote"]/span/text()')
            quote = quote[0] if quote else ''
            # 提取电影链接url
            link_url = div.xpath('./div[@class="hd"]/a/@href')[0].strip()
            # 根据key值提取数据
            d['title'] = title
            d['score'] = score
            d['evaluate'] = evaluate
            d['quote'] = quote
            d['link_url'] = link_url
            lis_data.append(d)
        return lis_data

    # 保存数据
    def save_source(self, move_data, header):
        # 保存解析后的数据到CSV文件中
        with open('movie_data.csv', 'a', encoding='utf-8-sig', newline='') as f:
            w = csv.DictWriter(f, header)
            # 写入表头
            w.writeheader()
            # 一次性写入多行数据
            w.writerows(move_data)

    # 主函数
    def main(self):
        start = int(input('输入要爬取的起始页:'))  # 输入起始页码
        end = int(input('输入要爬取的末尾页:'))  # 输入结束页码
        for i in range(start, end+1):
            time.sleep(2)  # 延时2秒,避免对目标服务器造成过大压力
            page = (i-1) * 25
            com_url = 'https://xxx/top250?start=' + str(page)
            h = self.get_source(com_url)
            print('爬虫机器人正在爬取第%d页' % i)  # 打印爬取页面信息
            move_data = self.parsed_source(h)
            # 设置表头
            header = ['title', 'score', 'evaluate', 'quote', 'link_url']
            self.save_source(move_data, header)  # 保存数据到CSV文件


if __name__ == '__main__':
    # 实例化对象
    Spider = DoubanSpider()
    # 调用主函数
    Spider.main()

总结

在本文中,我们介绍了如何使用Python编写一个简单的网络爬虫,并以某网电影网站为例进行了详细说明。通过对某网电影Top250页面的爬取,我们学习了发送HTTP请求、解析HTML文档、提取所需信息以及保存数据到CSV文件的基本操作。我们还对代码进行了进一步的优化,包括异常处理、数据去重、使用生成器优化内存占用、添加用户代理池等,以提高爬虫的稳定性、效率和可维护性。

除此之外,我们还讨论了一些提高爬虫功能和可用性的方法,如改进用户交互、添加定时任务、编写单元测试等。这些方法可以使得爬虫更加灵活和智能,满足不同场景下的需求,并提供了更多的扩展可能性。

在实际应用中,网络爬虫是一种强大的工具,可用于数据收集、信息监控、搜索引擎优化等各种领域。但是在使用爬虫时,我们必须遵守网站的使用条款和法律法规,尊重网站的隐私权和数据安全,避免对网站造成不必要的干扰和损害。

综上所述,本文介绍了从网络爬虫的基础知识到实际应用的全过程,希望能够帮助读者更好地理解和应用网络爬虫技术。在未来的工作中,我们可以进一步探索和应用更多的爬虫技巧,以满足不断变化的需求,并为数据获取和应用提供更多可能性。

在这里插入图片描述

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

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

相关文章

多线程的学习1

多线程 线程是操作系统能够进入运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。 进程:是程序的基本执行实体。 并发:在同一个时刻,有多个指令在单个CPU上交替执行。 并行:在同一时刻&#xff0c…

js改变图片曝光度(高亮度)

方法一: 原理: 使用canvas进行滤镜操作,通过改变图片数据每个像素点的RGB值来提高图片亮度。 缺点 当前项目使用的是svg,而不是canvas 调整出来的效果不是很好,图片不是高亮,而是有些发白 效果 代码 …

OC对象 - Block解决循环引用

文章目录 OC对象 - Block解决循环引用前言1. 循环引用示例1.1 分析 2. 解决思路3. ARC下3.1 __weak3.2 __unsafe_unretained3.3 __block 4. MRC下4.1 __unsafe_unretain....4.1 __block 5. 总结5.1 ARC下5.2 MRC下 OC对象 - Block解决循环引用 前言 本章将会通过一个循环引用…

GitHub如何验证2FA,烦人的认证,看完几分钟解锁

序言 今天需要使用GitHub,还是不能用,需要2FA认证,没办法,还是让2FA认证流程来,一一解决,在解决这认证问题之前,先说说2FA认证是什么? 什么是2FA 2FA 是指两步验证(Two…

用搜索引擎收集信息-常用方式

1,site csdn.net (下图表示只在csdn网站里搜索java) 2,filetype:pdf (表示只检索某pdf文件类型) 表示在浏览器里面查找有关java的pdf文件 3,intitle:花花 (表示搜索网页标题里面有花…

【小尘送书-第十五期】Excel函数与公式应用大全for Excel 365 Excel

大家好,我是小尘,欢迎你的关注!大家可以一起交流学习!欢迎大家在CSDN后台私信我!一起讨论学习,讨论如何找到满意的工作! 👨‍💻博主主页:小尘要自信 &#x1…

python--初学函数

函数(function): 什么是函数? 具有名称的,是为了解决某一问题,功能代码的集合,叫做函数 python中函数如何定义:def>define function定义函数 def function_name([args临时变量…

【QA】MySQL多表查询详解

文章目录 前言关系型数据库中数据表之间的关系数据准备数据内容表间关系 基础查询 | 全部查询多表查询分类1 | 连接查询内连接外连接 | 左外连接外连接 | 右外连接自连接 | 自连接自连接 | 联合查询 分类2 | 子查询返回结果分类 | 标量子查询返回结果分类 | 列子查询返回结果分…

linux centos7中使用 Postfix 和Dovecot搭建邮件系统

作者主页:点击! Linux专栏:点击! Postfix Postfix是一个开源的邮件传输代理(MTA),用于路由和传送电子邮件。它是一个可靠、安全且高性能的邮件服务器软件,常用于搭建邮件系统的核心…

redis简介及常用命令

一、关系数据库与非关系型数据库 1.1、关系型数据库 一个结构化的数据库,创建在关系模型基础上一般面向于记录包括:Oracle、MySQL、SQL Server、Microsoft Access、DB2等以上数据库在使用的时候必须先建库建表设计表结构,然后存储数据的时候…

centos7系统下nginx1.24.0升级

如果没有这些目录,请先创建: mkdir /data/software mkdir /data/program提前下载所需的软件: cd /data/software wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz wget https://nginx.org/download/nginx-1.24.0.tar.gz安装nginx cd /data/soft…

AM5SE系列微机保护装置在临沂奥体中心配电工程中的应用

摘 要:目前,微机保护装置广泛应用于电力系统中,该类装置能够有效监测电力系统的运行状况,并实时记录电力系统出现故障的位置及性质,从而为故障的快速处理提供有效的参考信息。本文介绍的AM5SE系列微机保护装置可以针对…

PCL点云处理之M估计样本一致性(MSAC)平面拟合(二百三十六)

PCL点云处理之M估计样本一致性(MSAC)平面拟合(二百三十五六) 一、算法介绍二、使用步骤1.代码2.效果一、算法介绍 写论文当然用RANSAC的优化变种算法MSAC啊,RANSAC太土太LOW了哈哈 MSAC算法(M-estimator Sample Consensus)是RANSAC(Random Sample Consensus)的一种…

【华大 HC32L110】调用`printf`和串口接收中断的冲突问题解决

华大单片机 HC32L110调用printf和串口接收中断的冲突问题解决,经过查找是官方库 去使能了 串口的接收功能,记录解决问题的过程 目录 1.硬件MCU资料2. printf和串口接收中断的冲突解决3.重新封装 fputc 函数4.查找问题,发现是官方库配置有误5. 查找寄存器手册,修改寄存器配置…

Discord账号多开如何做?有什么办法可以同时在线?

Discord 是一款免费的语音和文本聊天应用程序。它是一个游戏聊天应用程序和社区,最初是游戏的语音和IM服务,然后转向直播,然后是游戏商店的社区平台。它成为游戏玩家在游戏中交流和协作的首选工具。下面将为你介绍如何同时使用多个discord账号…

Linux文件(系统)IO(含动静态库的链接操作)

文章目录 Linux文件(系统)IO(含动静态库的链接操作)1、C语言文件IO操作2、三个数据流stdin、stdout、stderr3、系统文件IO3.1、相关系统调用接口的使用3.2、文件描述符fd3.3、文件描述符的分配规则3.3、重定向3.4、自制shell加入重…

【JavaEE】初识线程,线程与进程的区别

文章目录 ✍线程是什么?✍线程和进程的区别✍线程的创建1.继承 Thread 类2.实现Runnable接口3.匿名内部类4.匿名内部类创建 Runnable ⼦类对象5.lambda 表达式创建 Runnable ⼦类对象 ✍线程是什么? ⼀个线程就是⼀个 “执行流”. 每个线程之间都可以按…

Element-Plus下拉菜单边框去除教程

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

InputStream字节输入流和OutStream字节输出流

InputStream InputStream是Java标准库最基本的输入流,在java.io包内。它是一个抽象类。 FileInputStream:从文件中读取数据,是最终数据源。 int read()方法:读取输入流的下一个字节,并返回字节表示的int值(…

什么是Prompt Tuning?

本文是观看视频What is Prompt Tuning?后的笔记。 大语言模型(如ChatGPT )是基础模型,是经过互联网上大量知识训练的大型可重用模型。 他们非常灵活,同样的模型可以分析法律文书或撰写文章。 但是,如果我们需要用其解…