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…

运用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的…

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

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

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应用中必…

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

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

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

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

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

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

ARM Coresight 系列文章 11.1 -- CoreSight Cortex-M33 CTI 详细介绍】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 CTI 的工作原理CTI 主要特点CTI的使用场景CTI 的工作原理 CTI 允许不同的调试和追踪组件之间基于特定事件进行交互。例如,当一个断点被命中时,CTI 可以用来触发内存的追踪捕捉或者外部仪器的行为,反之亦然。这种…

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

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

无线局域网——wlan

目录 一.wlan的含义和发展 二.wlan技术带来的挑战 1.企业办公场景多样 2.位置速度的要求 3.安全的要求 4.规范的挑战 三.家庭和企业不同的部署需求 1.胖AP模式组网 2.AC瘦AP模式组网 3.组网模式的不同 四.三层隧道转发实验 1.拓扑 2.AP上线 核心交换机vlan ​编辑…

探索海外市场舆情:云手机助力企业赢得全球竞争

在全球化的趋势下,越来越多的企业将目光投向海外市场,迎接着无尽的商机与挑战。然而,随之而来的是境外市场舆情的复杂变化,对企业的声誉和发展带来了潜在风险。如何准确、及时地掌握境外市场的舆情动向,成为了企业必须…

Midjourney发布新特性风格参考

1. 引言 最近,Midjourney 推出了Style Reference V2.0 即功能更加强大的风格参考工具,该工具可以让大家参考其他图像的风格,生成与参考图像风格保持一致,与文本提示词语义内容保持一致的图像。它与图像提示类似,但是只…

Day03-数据库管理(事务管理,用户管理,MySQL8的部分新特性)

文章目录 Day03 数据库管理学习目标1. 事务管理1.1 事务的概念1.2 事务的特性1.3 语法1.4 事务的并发问题1.5 事务隔离级别1.6 设置和查看隔离级别 2 用户管理2.1 创建删除用户2.2 权限管理2.2.1 权限赋予的原则2.2.2 权限赋予2.2.3 权限回收2.2.4 登录管理 3. MySQL8的部分新特…

Java中的I/O讲解(超容易理解)(下篇)

如果想观看更多Java内容 可上我的个人主页关注我,地址子逸爱编程-CSDN博客https://blog.csdn.net/a15766649633?typeblog 使用工具 IntelliJ IDEA Community Edition 2023.1.4 使用语言 Java8 代码能力快速提升小方法,看完代码自己敲一遍&#xff0…

简易指南:国内ip切换手机软件怎么弄

在网络访问受到地域限制的情况下,使用国内IP切换手机软件可以帮助用户轻松访问被屏蔽的内容,扩展网络体验。以下是虎观代理小二分享的使用国内IP切换手机软件的简易指南。并提供一些注意事项。 如何在手机上使用国内IP切换软件 步骤一:选择I…

idea2023 运行多 springboot 实例

概要 1、修改idea运行多实例(本地测试负载) 你可能用到其他 1、改造项目缓存token 至redis 支持负载均衡部署 SpringSecurity6.0RedisJWTMP基于token认证功能开发(源码级剖析可用于实际生产项目)_springsecurity redis管理token…

嵌入式学习第二十九天!(数据结构的概念、单向链表)

数据结构: 1. 定义: 一组用来保存一种或者多种特定关系的数据的集合(组织和存储数据) 1. 程序设计: 将现实中大量而复杂的问题以特定的数据类型和特定的数据结构存储在内存中,并在此基础上实现某个特定的功…