当前位置: 首页 > news >正文

python—爬虫爬取电影页面实例

下面是一个简单的爬虫实例,使用Python的requests库来发送HTTP请求,并使用lxml库来解析HTML页面内容。这个爬虫的目标是抓取一个电影网站,并提取每部电影的主义部分。
首先,确保你已经安装了requests和lxml库。如果没有安装,可以通过pip安装它们:

pip install lxml

安装好lxml库后,就可以在Python代码中通过from lxml import etree来导入etree模块,并使用它提供的各种功能。
然后,我们可以编写如下的爬虫脚本:

import reimport fake_useragent
import requests
from lxml import etreeif __name__ == '__main__':# UA伪装head = {"User-Agent": fake_useragent.UserAgent().random}fp = open("./douban", "w", encoding="utf8")# 1.urlfor i in range(0,250,25):url = "https://movie.douban.com/top250?start={i}&filter="# 2.发送请求response = requests.get(url, headers=head)# 3.获取想要的数据res_text = response.text# 4.数据解析tree = etree.HTML(res_text)# 定位所有的li标签li_list = tree.xpath("//ol[@class='grid_view']/li")for li in li_list:film_name = "".join(li.xpath(".//span[@class='title'][1]/text()"))director_actor_y_country_type = "".join(li.xpath(".//div[@class='bd']/p[1]/text()"))score = "".join(li.xpath(".//span[@class='rating_num']/text()"))quote = "".join(li.xpath(".//span[@class='inq']/text()"))new_str = director_actor_y_country_type.strip()y = re.match(r"([\s\S]+?)(\d+)(.*?)", new_str).group(2)country = new_str.rsplit("/")[-2].strip()types = new_str.rsplit("/")[-1].strip()director = re.match(r"导演: ([a-zA-Z\u4e00-\u9fa5·]+)(.*?)", new_str).group(1)try:actor = re.match(r"(.*?)主演: ([a-zA-Z\u4e00-\u9fa5·]+)(.*?)", new_str).group(2)except Exception as e:actor = "no"fp.write(film_name + "#" + y + "#" + country + "#" + types + "#" + director + "#" + actor + "#" + score + "#" + quote + "\n")print(film_name, score, quote, y, country, types, director)fp.close()

这段代码是一个Python脚本,用于从豆瓣电影Top 250页面抓取电影信息,并将这些信息保存到本地文件中。下面是对代码的详细解释:

1.导入必要的库:

re: 用于正则表达式匹配。
fake_useragent: 用于生成随机的User-Agent,以模拟不同的浏览器访问,避免被网站识别为爬虫。
requests: 用于发送HTTP请求。
lxml.etree: 用于解析HTML文档,提取所需信息。

2.设置User-Agent:

使用fake_useragent.UserAgent().random生成一个随机的User-Agent,并存储在head字典中,作为HTTP请求头的一部分。

3.打开文件:

使用open(“./douban”, “w”, encoding=“utf8”)以写入模式打开(或创建)一个名为douban的文件,用于存储抓取的电影信息。

4.循环请求豆瓣电影Top 250页面:

通过循环,每次请求豆瓣电影Top 250页面的一个子集,start参数从0开始,每次增加25,直到250(但不包括250,因为range的结束值是开区间)。

5.发送HTTP请求:

使用requests.get(url, headers=head)发送GET请求,请求头中包含之前设置的User-Agent。

6.解析HTML文档:

使用etree.HTML(res_text)将响应的文本内容解析为HTML文档。
通过XPath表达式//ol[@class=‘grid_view’]/li定位所有包含电影信息的li标签。

7.提取电影信息:

遍历每个li标签,提取电影名称、导演/演员/年份/国家/类型、评分、简介等信息。
使用正则表达式处理director_actor_y_country_type字符串,以提取年份、国家和类型。
注意,这里对演员信息的提取使用了异常处理,如果正则表达式匹配失败(例如,某些电影信息中可能没有演员信息),则将演员设置为"no"。

8.写入文件:

将提取的电影信息拼接成字符串,并写入之前打开的文件中,每条信息占一行。

9.关闭文件:

循环结束后,关闭文件。
在这里插入图片描述
这里我们截取了部分输出结果的信息,可以看到已经成功爬取电影网站中的部分信息,这个简单的爬虫示例展示了如何发送HTTP请求、解析HTML内容以及提取所需信息的基本流程。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • AI 绘画|Midjourney设计Logo提示词
  • Unity | AssetBundle
  • 【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 卢小姐的生日礼物(200分) - 三语言AC题解(Python/Java/Cpp)
  • 哪些企业适合做ISO27001信息安全管理体系?
  • 定制QCustomPlot 带有ListView的QCustomPlot 全网唯一份
  • SpringAI简单使用(本地模型+自定义知识库)
  • Linux处理文件sed
  • Java 新手学习线路,Java 学习路线是怎样的?
  • uniapp自定义tabBar
  • unity2022 il2cpp 源码编译
  • 信息检索(39):Condenser: a Pre-training Architecture for Dense Retrieval
  • SpringBoot源码深度解析
  • # Redis 入门到精通(九)-- 主从复制(1)
  • buu做题(6)
  • 时间卷积网络(TCN):序列建模的强大工具(附Pytorch网络模型代码)
  • #Java异常处理
  • 【译】理解JavaScript:new 关键字
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • CSS中外联样式表代表的含义
  • ECMAScript入门(七)--Module语法
  • emacs初体验
  • HTTP中GET与POST的区别 99%的错误认识
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Java方法详解
  • Vue实战(四)登录/注册页的实现
  • 复杂数据处理
  • 技术:超级实用的电脑小技巧
  • 简单实现一个textarea自适应高度
  • 开源SQL-on-Hadoop系统一览
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 前端路由实现-history
  • 使用docker-compose进行多节点部署
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • raise 与 raise ... from 的区别
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (一)SvelteKit教程:hello world
  • (转)LINQ之路
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转)一些感悟
  • (转载)深入super,看Python如何解决钻石继承难题
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .net 8 发布了,试下微软最近强推的MAUI
  • .Net Core 中间件与过滤器
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • @EventListener注解使用说明
  • [ Linux ] Linux信号概述 信号的产生
  • [023-2].第2节:SpringBoot中接收参数相关注解
  • [100天算法】-二叉树剪枝(day 48)
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [Android]通过PhoneLookup读取所有电话号码