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

文章目录

  • 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 timeclass 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'] = titled['score'] = scored['evaluate'] = evaluated['quote'] = quoted['link_url'] = link_urllis_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) * 25com_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'] = titled['score'] = scored['evaluate'] = evaluated['quote'] = quoted['link_url'] = link_urlyield d
  1. 添加用户代理池

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

  1. 日志记录

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

  1. 数据存储方式

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

  1. 用户交互改进

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

import argparsedef 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.startend = args.endfor i in range(start, end+1):# 爬取逻辑不变

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

  1. 添加定时任务

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

from apscheduler.schedulers.blocking import BlockingSchedulerdef scheduled_task():Spider = DoubanSpider()Spider.main()if __name__ == "__main__":scheduler = BlockingScheduler()scheduler.add_job(scheduled_task, "interval", minutes=60)  # 每隔60分钟执行一次scheduler.start()
  1. 添加单元测试

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

import unittestclass 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 ''# 提取电影链接urllink_url = div.xpath('./div[@class="hd"]/a/@href')[0].strip()# 根据key值提取数据d['title'] = titled['score'] = scored['evaluate'] = evaluated['quote'] = quoted['link_url'] = link_urllis_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) * 25com_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.mzph.cn/news/762489.shtml

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

相关文章

txt、pdf等文件转为一行一行的doccano数据集输入格式

文章目录 doccano 数据集导入简介代码实现代码运行结果代码公开 doccano 数据集导入 在Doccano 导入数据集时,使用TextLine的文件格式,导入的文件需要为一行一行文本的数据格式,每一行文本在导入Doccano后就是一条数据。 简介 主要工作说明…

LeetCode-热题100:17.电话号码的字母组合

题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入: digits “23” 输出&a…

MySql事务原理与优化建议

MySql事务原理与优化建议 前言一、事务的定义二、事务的ACID特性三、事务的隔离性四、读写锁五、MVCC机制六、事务提交的流程七、大事务的影响八、事务优化建议总结 前言 最新的 Java 面试题,技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、My…

运用YOLOv5实时监测并预警行人社交距离违规情况

YOLO(You Only Look Once)作为一种先进的实时物体检测算法,在全球范围内因其高效的实时性能和较高的检测精度受到广泛关注。近年来,随着新冠疫情对社交距离管控的重要性日益凸显,研究人员开始将YOLO算法应用于社交距离…

python知识点总结(七)

python知识点总结七 1、堆和栈的区别2、如何在局部修改全局的变量a、计算结果b、计算结果 3、如何修改一个enclosing变量4、关于值传递还是地址传值5、布尔类型6、逻辑运算7、字符串切片操作8、取整、取余、除数9、变量赋值10、字符串与数字相乘11、整型、浮点型、字符型之间相…

List系列集合:ArrayList、LinkedList --java学习笔记

List系列集合 特点:有序、可重复、有索引 ArrayList:有序、可重复、有索引LinkedList:有序、可重复、有索引 List集合的特有方法 List集合因为支持索引,所以多了很多与索引相关的方法,当然,Collection的…

CentOS7 安装和使用Docker

文章目录 前言一、Docker的主要优势二、安装前必读三、安装Docker的详细步骤1. 安装需要的软件包2. 设置仓库3. 安装Docker方式一 使用官方安装脚本自动安装方式二 选择版本并安装4. Docker运行操作4.1 启动4.2 关闭4.3 运行状态4.4 开机自启四、在没有Sudo的情况下执行Docker命…

软件工程(双语)

教材《软件工程 实践者的研究方法》 双语教学,但目前感觉都是在讲没用的 ”过程决定质量,复用决定效率” 介绍 软工的本质 程序数据结构算法 软件程序文档(需求、模型、说明书) 软件应用: 系统软件 应用 工程/科学…

Spring Cloud Gateway 中GET请求能正常访问,POST请求出现Unable to handle DataBuffer

报错信息如下: java.lang.IllegalArgumentException: Unable to handle DataBuffer of type class org.springframework.http.server.reactive.UndertowServerHttpRequest$UndertowDataBufferat org.springframework.cloud.gateway.filter.NettyRoutingFilter.getB…

代码随想录笔记|C++数据结构与算法学习笔记-字符串(二)|28. 实现 strStr()、459.重复的子字符串、KMP算法

文章目录 卡码网.右旋字符串28. 实现 strStr()KMP算法(理论)KMP算法(代码)C代码 459.重复的子字符串暴力解法移动匹配KMP解法 卡码网.右旋字符串 卡码网题目链接 略 28. 实现 strStr() 力扣题目链接 文字链接:28. 实现 strStr() 视频链接:帮你把KMP算法…

JAVA刷题 字符操作串各种方法总结(随时更新)

写在前面 JAVA万能头: import java.io.*; import java.util.*;JAVA字符串方法参数操作 谨记【左闭右开】原则 一、substring()方法 两个参数: 字符串.substring(参数1,参数2); 参数1:字符串截取的起始下标,非负的整…

CentOS yum安装MongoDB的详细教程

一、准备工作 打开终端或SSH会话,并使用root或具有管理员权限的用户登录到CentOS服务器。 二、添加MongoDB的源 执行以下命令添加MongoDB的存储库 sudo vi /etc/yum.repos.d/mongodb-org.repo 在编辑器中,复制并粘贴以下内容 [mongodb-org-6.0] name…

什么是UI设计?适合做UI设计的软件有哪些?

人们常说 UI 和 UI 设计,但到底什么是 UI 设计?UI 设计的原则是什么?实际上 “UI" 也就是 User Interface,它是用户界面的缩写。一般指用户操作界面,即软件程序、网站或设备的图形部分,用户与之互动。…

GEE学习——初学者如何下载指定区域的Sentinel-2影像

简介 初学者如何下载指定区域的Sentinel-2影像? 初学者可以按照以下步骤利用Google Earth Engine(GEE)下载指定区域的Sentinel-2影像: 登录GEE账号并打开代码编辑器。代码编辑器位于GEE主页左上角的"Code Editor"按钮。 在代码编辑器中,点击左上角的"App…

自定义高亮文字的textview,匹配关键字词高亮,匹配可拆分的字词高亮

自定义高亮文字的textview,匹配关键字词高亮,匹配可拆分的字词高亮 import android.graphics.Color; import android.text.SpannableString; import android.text.Spanned; import android.text.style.ForegroundColorSpan;import java.util.regex.Match…

MyBatis3源码深度解析(十九)MyBatis日志实现

文章目录 前言第七章 MyBatis日志实现7.1 Java日志体系7.1.1 常用日志框架7.1.2 Java日志发展史7.1.3 日志接口与日志实现的绑定 7.2 MyBatis日志实现7.2.1 Log接口7.2.2 LogFactory工厂7.2.3 MyBatis日志自动查找7.2.4 MyBatis日志类型配置 7.3 小结 前言 日志是Java应用中必…

蓝桥算法练习系统—卡勒沃夫之弱水路三千(提高型)(拓扑排序)

问题描述 锦瑟年华谁与度 莫问情归处 只影向斜阳 剑吼西风 欲把春留驻   天涯芳草无归路 回首花无数 解语自销魂 弱袂萦春 尘缘不相误   ......   在卡勒沃夫充满文学杀伤力的声音中,身处紫荆2号楼202B的四位远近高低各不同的室友纷纷回忆起了各自波澜起伏的过…

【合合TextIn】深度解析智能文档处理技术与应用

目录 一、智能文档处理介绍 二、文档格式解析 三、图像增强技术解析 四、传统文字识别OCR技术解析 五、深度学习OCR技术解析 六、深度学习版面分析技术解析 七、文档分类 八、信息抽取 九、系统集成:将IDP处理后的数据集成到企业系统 结论 一、智能文档处…

机器学习-06-无监督算法-01-划分聚类Kmeans算法

总结 本系列是机器学习课程的系列课程,主要介绍机器学习中无监督算法,包括划分聚类等。 参考 数据分析实战 | K-means算法——蛋白质消费特征分析 欧洲48国英文名称的来龙去脉及其国旗动画 Kmeans在线动态演示 本门课程的目标 完成一个特定行业的…

如何与手机共享笔记本电脑的互联网?这里提供详细步骤

这篇文章介绍了如何通过将手机变成Wi-Fi热点来与手机共享笔记本电脑的互联网连接。 如何共享笔记本电脑的互联网连接 你可以通过Wi-Fi或有线共享笔记本电脑的数据连接,具体取决于你的设置。 Windows Windows允许你通过ICS共享你的互联网连接。ICS,或称互联网连接共享,是W…