「数据采集与网络爬虫(使用Python工具)」【数据分析全栈攻略:爬虫+处理+可视化+报告】
- 第 103 篇 -
Date: 2025 - 06 - 01
Author: 郑龙浩/仟墨
文章目录
- 「据采集与网络爬虫」【使用工具:Python】
- 一 数据采集
- 1 数据采集综述
- (1)基本介绍
- (2)数据目标源
- (3)采集方式
- (4)数据形式
- 2 互联网数据采集(重点)
- (1)什么是网络爬虫?
- (2)常见的网络爬虫 和 爬虫采集器
- (3)爬虫的流程
- (4)反爬虫技术
- 3 数据采集基本流程
- 二 HTTP请求和响应
- (1)HTTP(Hypertext Transfer Protocol)协议
- (2)URL(Uniform Resource Locator)
- (3)HTTP请求和响应?
- (4)HTTP请求的组成:
- ① HTTP请求部分
- ② HTTP响应部分
- (4)requests库
- 三 使用requests 库
- 1 安装 requests 库
- 2 使用 requests 拿到某网站源码
- 2.1 `import requests`
- 2.2 `head = {'User-Agent' : 'Mozilla/5.0 (windows NT 11.0; Win64; x64)'}`
- 2.3 `response = requests.get("http://books.toscrape.com/", headers=head)`
- 2.4 `if response.ok:`
- 2.5 `print(response.text)`
- 2.6 `print(f'请求失败,服务器错误\n状态码: {response.status_code}')`
- 四 Beautiful Soup解析HTML
- 1. Beautiful Soup 介绍
- 2. 安装及使用
- (1)安装
- (2)基础代码流程
- 3. 常用方法
- 常用方法:
- 必会四大核心方法(优先掌握)
- 4. 数据提取的技巧
- 五 具体案例
- **1 实现代码:**
- **2 实现效果(输出内容如下)**
「据采集与网络爬虫」【使用工具:Python】
一 数据采集
一般来说使用 Python 进行数据采集的
1 数据采集综述
数据采集一般分为三部分:数据目标源、采集方式、数据形式。
(1)基本介绍
概念:数据采集又称数据获取,搜集符合数据挖掘研究要求的原始数据。
- 数据次啊及是大数据分析的入口,所以是相当重要的一个环节。
- 大数据采集与预处理是获取有效数据的重要途径,也是大数据应用的重要支撑。
- 数据采集范围决定数据分析挖掘的维度深度。
(2)数据目标源
定义:数据的来源,是提供某种所需要数据的期间或原始媒体。
-
组织内部数据
- 企业或组织内部业务生产系统产生的数据,如ERP、CRM、工作流管理、人力资源系统、办公协同系统或各类生产系统。
- 采集方法:一般采用数据导出、ETL工具抽取或者数据服务接口共享的形式提供。
-
互联网数据
- 指主流电商平台、大型综合网站、专业垂直网站、微信微博等外部互联网数据如京东商城商品数据。
数据采业:一股采用爬虫或者平台提供的数据接口进行采集。 - 采集方法:一般采用爬虫或者平台提供的数据接口进行采集。
- 指主流电商平台、大型综合网站、专业垂直网站、微信微博等外部互联网数据如京东商城商品数据。
-
物联网数据
- 指传感器、射频识别技术、全球定位系统、红外感应器、激光扫描器等各种装置产生的数据,如视频数据、位置数据等。数据采集:此类数据采集一般采用SDK、服务接口、协议端口等方式。
- 采集方法:采集一般采用SDK、服务接口、协议端口等方式。
-
政府公开数据
-
指政府通过官方网站或者共享开放平台对外提供数据,如欠税公告、信用企业名单等数据。
注意,一定是公开的数据
-
采集方法:此类数据采集一般采用爬虫或者平台提供数据接口进行采集。
-
-
第三方数据
- 指从外部来源购买的数据,而不是自己直接采集的数据。第三方咨询公司或者数据管理咨询平台,会收集业务相关的数据自己使用的同时也会提供数据服务。数据采集:外部来源购买数据。
(3)采集方式
主要方法:
- 问卷调查/访谈
- 物联网设备/SDK
- 网络爬虫/Python
- OpenAPI接口
- 其他技术
可以采集什么
- 采集物理世界的信息传感器
- 采集数字设备运行状态日志文件
- 采集互联网信息的网络爬虫(主要学习网络爬虫的采集方式)
(4)数据形式
- 图片、视频、音频
- 网页
- 文本
- Excel、CSV
- XML等格式
2 互联网数据采集(重点)
主要使用网络爬虫(使用Python)
网络爬虫不只是应用于搜索引擎,还有舆情监控、数据挖掘
(1)什么是网络爬虫?
-
爬虫请求网站并提取数据的自动化程序。
-
又称网络蜘蛛、网络蚂蚁、网络机器人
-
爬虫算法:它可以不受人工干涉自动按照既定规则浏览互联网中的信息,我们把这种既定的规则,称为爬虫算法
-
核心能力:使用Python,通过既定规则(爬虫算法)自动浏览和提取互联网信息
-
**技术本质:**模拟HTTP请求 → 获取响应 → 解析数据 → 存储结构化内容
(2)常见的网络爬虫 和 爬虫采集器
常见的网络爬虫
- Googlebot(Google搜索引擎)
- Baiduspider(百度搜索引擎)
- Bingbot(微软Bing搜索引擎)
- Sogouspider(搜狗公司搜索引擎)
爬虫采集器
工具名称 | 特点 | 适用场景 | 局限性 |
---|---|---|---|
八爪鱼 | 可视化操作,无需编程,拖拽就可以抓数据 | 企业非技术员工快速采集 | 复杂网站支持较差 |
后羿采集器 | 支持Ajax和滚动加载,中文界面 | 动态页面采集 | 收费版功能受限 |
火车头 | 分布式采集,企业级解决方案 | 大规模数据抓取 | 学习成本高 |
(3)爬虫的流程
- 网络爬虫实质上是一个能自动下载网页的程序,它是搜索引擎中最核心的部分
- 我们所谓的上网便是由用户端计算机发送请求给目标计算机,将目标计算机的数据下载到本地的过程
- 而爬虫程序要做的就是 模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或文件中
(4)反爬虫技术
**概念:**网站用来保护服务器资源,数据资源等的防护措施。为了不让自家的数据被别人随意的爬走而设置的屏障。
- 通过headers字段反爬
- 无论是浏览器还是爬虫程序,在向服务器发起网络请求的时候,都会发送一个headers文件。通过User-Agent字段来反爬。
- **反反爬:**通过伪装user-agent,模拟成真实的浏览器去取出内容。
- 通过登录限制反爬
- 网站 或者 APP 可以提示一些基础的数据,当需要访问比较重要或者更多的数据时,则要求用户必须登录后才可以法问。
- 反反爬:模拟手动输入账号密码的过程获得登录成功后的cookie,进入页面获取数据。
- 通过IP限制反爬
- 一些网站会根据 IP 地址访问的频率,次数进行反爬。如果用单一的IP 地址访问频率过高,短时间内禁止这个IP 访问。
- 反反爬:构造自己的IP 代理池,然后每次访问时随机选择代理。
- 通过设置验证码反爬
- 验证码是非常常见的反爬虫方式,服务提供方在IP 地址访问次数达到一定数量后,可以返回验证码让用户进行验证。
- 反反爬:简单验证码可以使用打码平台进行破解,或者每抓取一个页面就休息随机数秒。
3 数据采集基本流程
步骤 | 1 发送请求 | 2 获取内容 | 3 解析内容 | 4 保存数据 |
---|---|---|---|---|
手动 | 用户手动输入网址,向服务器发送请求 | 服务器相应内容,返回客户端浏览器 | 用户手动浏览浏览器内容,找到需要的数据 | 用户手动下载、记录、保存到目标地方 |
爬虫 | 爬虫自动输入网址,向服务器发送请求 | 服务器响应内容,返回给爬虫 | 自动解析网页内容,按规则寻找所需数据 | 爬虫自动下载保存到目标地方 |
二 HTTP请求和响应
(1)HTTP(Hypertext Transfer Protocol)协议
**超文本传输协议(HTTP)**是浏览器和服务器之间的传输协议,它通常运行在传输控制协议之上。它制定了浏览器可能发送给服务器什么样的消息以及得到什么样的响应。
(2)URL(Uniform Resource Locator)
定义:
- 称为统一资源定位符,又名网址。
- 互联网上的每个页面,都有对应的一个URL
URL组成:
举例:拼多多超市网址为:https://www.pinduoduo.com/home/supermarket/
https
:拼多多网址的协议部分,表示超文本传输协议www.pinduoduo.com
:拼多多的网站名部分,表示该网页所在的主机位置- 端口部分:跟在域名后面的是端口,域名和端口之间使用
:
作为分隔符,端口不是一个URL必须的部分,如果采用默认端80,则可以省略端口部分 /home/supermarket/
:拼多多视频超市的虚拟目录和文件名部分,表示该网页在这个主机上的具体路径
(3)HTTP请求和响应?
- HTTP是一种客户端和服务器之间的请求、响应协议。
- 过程:浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求,该请求发送到web服务的一个监听端口上(默认端口是80)。Web服务器根据接收到的请求后,向客户端发送响应结果。
- **比如:**浏览器就是客户端,当在浏览器地址栏输入想访问的网址,按下回车后,浏览器就会向网站的服务器发送请求,然后等待服务器返回给浏览器响应。
常用方法
get 方法(最常用) | post 方法 |
---|---|
获得数据 | 创建数据 |
浏览器会发送get 请求,得到网页内容 | 当我们提交账号注册表单时,浏览器会发送post 请求,把用户名、密码等信息放到请求主体里,给到服务器 |
(4)HTTP请求的组成:
在服务器接收到 HTTP 请求后,会根据所有信息返回 HTTP 响应
① HTTP请求部分
完整的请求部分
POST /user/info?new_user=true HTTP/1.1
Host: www.douban.com
User-Agent: Mozilla/5.0
Accept: */*
Content-Type: application/json
Content-Length: 68
{"username": "example_user","email": "user123@example.org"
}
包含三部分请求行、请求头、请求体
- 请求行
POST /user/info?new user=true HTTP/1.1
// 含义: 户端使用 HTTP 1.1 协议,向服务器发送一个 POST 请求,目标是 /api/user/profile 路径,可能用于 创建或更新用户资料。
**
POST
:**HTTP 方法作用:向服务器提交数据(用于创建和修改资源)
/user/info?new user=true
:请求的目标路径
- 路径部分
/user/info
→ 资源路径- 查询参数
?new_user=true
→ 附加条件(需用_
替代空格,修正为new_user=true
)www.douban.com/movie/top250?start75&filter=unwatchedwww.douban.com -> 域名(非路径部分,属于 Host 头) /movie/top250 -> 资源路径 ?start=75&filter=unwatched -> 查询参数
HTTP/1.1
表示使用的是 HTTP 1.1 协议。作用:定义客户端和服务器通信的规则
- 请求头
包含一些给服务器的信息
Host: www.douban.com
User-Agent: Mozilla/5.0
Accept: */*
Content-Type: application/json
Content-Length: 68
Host: api.example.org
:请求的目标域名(必填)
Host
是必填字段,需与请求的域名一致(如访问www.douban.com
时,Host
应为www.douban.com
)。
User-Agent: Mozilla/5.0
:告知服务器客户端的相关信息,比如请求是浏览器发出的,类型是什么,版本是什么
Accept: */*
:高速服务器客户端想接收到的相应数据是什么类型的,接受多种类型可以用逗号进行分隔类型举例:
- 接受HTML ->
text/html
- 接受JSON ->
application/json
- 接受HTML和JSON ->
text/html,application/json
- 接受任意类型 ->
*/*
-
请求体
请求体里面可以放客户端传给服务器的其他任意数据,但是**
get
方法的请求体一般是空的**
{"username": "example_user","email": "user123@example.org"
}
② HTTP响应部分
完整的响应部分
HTTP/1.1 200 OK
Date: Fri,27 Jan 2023 02:10:48 GMT
Content-Type: text/html; charset=utf-8
<!DOCTYPE html>
<head><title>首页</title></head>
<body><h1>名字</h1><p>哈喽:</p>
</body>
</html>
和HTTP请求部分一样也是包含三部分,分别是状态行、响应头、响应体
-
状态行
HTTP/1.1 200 OK
-
HTTP/1.1
:协议版本举例: HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2.0 ...
-
200
:状态码 -
OK
:状态消息状态码和状态消息是对应的:
-
2开头:表示成功,请求已经完成处理
-
3开头:表示重定向,需要进一步的操作
-
4开头:表示客户端错误,比如请求里面有错误,或请求的资源无效
比如在输入一个错误的网址以后,我们通常会来到一个显示404的界面,这个404就是HTTP状态码
-
5开头:表示服务器错误,比如出现问题或正在维护
状态码 状态消息 说明 200 OK 客户端请求成功 301 Moved Permanently 资源被永久移动到新地址 400 Bad Request 客户端请求不能被服务器所理解 401 Unauthorized 请求未经授权 403 Forbidden 服务器拒绝提供服务 404 Not Found 请求资源不存在 500 Internal Server Error 服务器发生不可预期的错误 503 Service Unavailable 服务器当前不能处理客户端的请求 -
-
-
响应头
响应头会包含一些告知客户端的信息
Date: Fri,27 Jan 2023 02:10:48 GMT Content-Type: text/html; charset=utf-8
-
Date
:生成响应的日期和时间示例值 说明 格式 Day, DD Mon YYYY HH:MM:SS GMT
固定格式,遵循 RFC 7231 规范 示例 Date: Fri, 27 Jan 2023 02:10:48 GMT
服务器返回响应的确切时间 -
Content-Type
:返回内容的类型和编码格式,客户端依次解析数据常见类型 例(左边内容,右边编码格式) 应用 HTML 文本 text/html; charset=utf-8
返回 HTML 页面(如网页)。 纯文本 text/plain; charset=utf-8
返回纯文本(如日志、配置文件)。 JSON 数据 application/json; charset=utf-8
REST API 的常见响应格式。 XML 数据 application/xml; charset=utf-8
传统 WebService 或 SOAP 接口。 表单数据 application/x-www-form-urlencoded
提交表单时的默认编码类型。 二进制文件(如图片) image/png
返回图片、PDF 等二进制文件(无需指定编码)。 JavaScript 文件 application/javascript; charset=utf-8
返回 JS 脚本文件。 CSS 文件 text/css; charset=utf-8
返回样式表文件。 流媒体(如视频) video/mp4
返回视频流或音频文件。
-
-
响应体
<!DOCTYPE html> <!-- 声明文档类型为 HTML5 --> <head><title>首页</title></head> <!-- 头部区域:网页标题显示为“首页” --> <body> <!-- 网页可见内容区域 --><h1>名字</h1> <!-- 一级标题,显示“名字”(注意:此处有笔误应为</h1>) --><p>哈喽:</p> <!-- 段落文本,显示“哈喽:” --> </body> <!-- 表示 body 内容到此结束 --> </html> <!-- 表示 HTML 文档到此结束 -->
(4)requests库
定义:requests库是一个Python的第三方库,可以通过调用来帮助我们实现自动爬取HTML网页页面以及模拟人类访问服务器自动提交网络请求。
requests不是Python自带的,在Python中使用的时候要先安装这个库
方法 | 说明 | 典型应用场景 |
---|---|---|
requests.request() | 所有请求的底层实现方法(支持完全自定义请求参数) | 需要自定义HTTP方法或超精细控制时使用 |
requests.get() | 获取目标URL的资源内容(最常用) | 抓取网页内容、调用只读API接口 |
requests.head() | 仅获取URL的响应头信息(不返回响应体,节省流量) | 快速检查资源状态、验证文件元信息(大小/类型) |
requests.post() | 向URL提交数据(如表单/JSON),触发服务端处理(通常用于创建资源) | 用户登录认证、文件上传、提交表单数据 |
requests.put() | 提交完整资源数据,服务端将完全替换目标资源(需所有字段) | 全量更新用户资料(需提交完整JSON对象) |
requests.patch() | 提交部分字段,服务端仅更新指定字段(无需完整资源) | 修改用户部分信息(如仅调整手机号或昵称) |
requests.delete() | 删除URL资源 | 删除数据库记录、注销账号 |
三 使用requests 库
- 下面的内容是如何使用 requests 发送请求并获取内容
- 分别解释其中的内容
1 安装 requests 库
由于 requests 库是第三方库,不是Python自带的,所以要先安装这个库
-
在Python中打开终端(Terminal)窗口
-
在终端窗口中输入
pip install requests
,按回车,自动安装 -
如果有一行显示了
Successfully installed ...
,表示安装成功,比如显示Successfully installed certifi-2025.4.26 charset-normalizer-3.4.2 idna-3.10 requests-2.32.3 urllib3-2.4.0
-
如果显示
Requirement already satisfied: requests in 某某路径
则表示之前已经安装过了,也就不需要再安装了 -
安装成功以后,就可以在python中使用
requests
库了
2 使用 requests 拿到某网站源码
import requests
head = {'User-Agent' : 'Mozilla/5.0 (windows NT 11.0; Win64; x64)'
}
response = requests.get("http://books.toscrape.com/", headers = head)
if response.ok:print(response.text)
else:print(f'请求失败,服务器错误\n状态码: {response.status_code}')
分行解析
2.1 import requests
- 导入
requests
库,用于发送 HTTP 请求。
2.2 head = {'User-Agent' : 'Mozilla/5.0 (windows NT 11.0; Win64; x64)'}
这是一个字典变量
-
定义请求头(
headers
),伪装浏览器访问,避免被服务器识别为爬虫。 -
User-Agent
是浏览器标识,不同浏览器有不同的值。该键的值会给服务器提供一些客户端的信息。 -
这里伪造的是 Windows 11 上的 Chrome/Firefox 的
User-Agent
。为什么需要伪造 User-Agent?
因为浏览器浏览网页的时候,会自动发送 get 请求,并且请求头 User-Agent 自动携带完整的
User-Agent
(包含浏览器类型、版本、操作系统等)但是用代码发送请求时:
- 不会带有浏览器相关信息,(
python-requests
库会暴露编程身份) - 部分网站不想让程序爬取自己的网站,可能会根据
User-Agent
携带的信息拒绝来自程序的请求,因此为了让程序可以访问某些网站,需要通过篡改 headers 的 User-Agent 的信息(键对应的值),将代码请求伪装成浏览器访问
- 不会带有浏览器相关信息,(
如何获取真实的 User-Agent 值?
其实也就是获取某个浏览器的真实标识
- 进入任意一个浏览器(我用的chrome)中的任意网页 –> 右键空白处 –> 选择 检查。
- 切换到 Network 选项卡 –> 按 F5 刷新页面(此时会显示所有请求)。
- 单击任意请求(
.js
或.html
文件) –> 查看 Headers 选项卡 –> 展开 Request Headers –> 复制user-agent
的值(冒号后的内容)。
2.3 response = requests.get("http://books.toscrape.com/", headers=head)
response实际上就是HTTP请求后服务器返回的响应对象
-
发送 GET 请求 到目标 URL,并带上自定义的请求头。
-
requests.get()
发送 GET 请求的方法。 -
headers=head
使用自定义的请求头。
-
对该响应对象的操作有如下几个,可以获取响应信息:
信息类型 | 代码方法 | 说明 |
---|---|---|
响应头 | response.headers | 获取服务器返回的头部信息 |
状态码 | response.status_code | 获取HTTP状态码(如 200、404) |
响应内容 | response.text | 获取网页/文本响应内容 |
JSON数据 | response.json() | 解析API返回的JSON数据(自动转为字典/列表) |
请求网址 | response.url | 获取实际请求的最终URL(含重定向后的地址) |
请求成功 | response.ok | 快速判断请求是否成功 |
原始数据 | response.content | 获取二进制响应内容(图片/文件) |
耗时 | response.elapsed | 获取请求耗时 |
2.4 if response.ok:
-
检查请求是否成功(HTTP 状态码
200-299
)。response.ok
也可以写成response.status_code >= 200 and response.status_code < 300
,但是不如使用ok
方法来的方便-
response.ok
相当于response.status_code >= 200 and response.status_code < 300
,也就是检测状态码是否是200 201 204...
-
如果请求失败(比如404),会进入
else
分支。
-
2.5 print(response.text)
-
打印服务器返回的 网页源代码
-
response.text
返回的是字符串格式的响应内容。
2.6 print(f'请求失败,服务器错误\n状态码: {response.status_code}')
- 如果错误,进行提示
response.status_code
返回的是状态码
四 Beautiful Soup解析HTML
当爬取到某网页的HTML后,需要从一堆戴那种获取有价值的信息,就需要Beautiful Soup
对HTML进行解析
1. Beautiful Soup 介绍
bs4
(Beautiful Soup 4)是一个用于HTML/XML解析的Python库,其提供的BeautifulSoup
类可将文档转换为Unicode编码并解析为树形结构,简化数据提取过程
2. 安装及使用
(1)安装
- 在终端中输入如下进行安装
pip install bs4
- 如果出现了
Successfully installed bs4-0.0.2
之类的字样,表示安装成功
(2)基础代码流程
from bs4 import BeautifulSoup # 导入库
import requests # 用于发送HTTP请求的库# 1. 获取网页内容
url = "https://example.com" # 目标网页URL
response = requests.get(url) # 获取网页内容
if response.status_code == 200: # 检查请求是否成功html_content = response.text # 网页的HTML源代码
else:print(f'请求访问失败,错误状态码{response.status_code}')exit() # 如果请求失败则退出程序# 2. 创建BeautifulSoup对象
# 参数说明:
# html_content: 网页HTML内容
# 'html.parser': 指定使用Python内置的HTML解析器
# 其他可选解析器:'lxml'(更快), 'html5lib'(更容错)
soup = BeautifulSoup(html_content, 'html.parser')# 3. 提取数据
# find_all()方法会返回文档中所有匹配的<h1>标签的列表
# 参数说明:
# 'h1': 要查找的标签名称(这个表示一级标题标签)
# 还可以添加其他参数如class_、id等来更精确地定位元素title = soup.find('h1') # 查找单个元素
all_titles = soup.find_all('h1') # 查找多个元素,所有<h1>标签# 4. 打印结果
for title1 in all_titles:print(title1.string)
3. 常用方法
常用方法:
方法 | 常用度 | 描述 |
---|---|---|
find_all() | 3 | 返回所有匹配的标签列表 |
find() | 3 | 返回第一个匹配的标签 |
get_text() | 3 | 获取标签内纯文本(可去除空白) |
select() | 3 | CSS选择器查找(返回列表) |
attrs | 3 | 获取标签的所有属性字典 |
select_one() | 2 | CSS选择器查找单个结果 |
parent | 2 | 获取父节点 |
has_attr() | 2 | 检查是否包含某属性 |
contents | 1 | 获取子节点列表(含换行等空白节点) |
next_sibling | 1 | 获取下一个兄弟节点(含空白节点) |
find_next() | 1 | 查找文档中之后出现的第一个匹配标签 |
必会四大核心方法(优先掌握)
-
find_all( name, attrs, recursive, text, limit )
# 获取前5个class="title"的<span>标签 soup.find_all('span', class_='title', limit=5)
-
find( name, attrs, recursive, text )
# 获取第一个<div id="main">标签 soup.find('div', id='main')
-
get_text( separator, strip )
# 获取文本并去除首尾空格 title = soup.find('h1').get_text(strip=True)
-
select( css_selector )
# 获取所有<div class="item">下的<a>标签 soup.select('div.item > a')
4. 数据提取的技巧
-
按标签名查找
soup.find_all('a') # 所有<a>标签
-
按属性查找
soup.find_all('div', class_='header') # class需要加下划线 soup.find_all(attrs={"data-id": "123"}) # 自定义属性
-
层级查找
soup.select('div.content > p') # div.content下的直接子p标签
-
获取属性值
link = soup.find('a') print(link['href']) # 获取href属性
五 具体案例
任务:得到豆瓣电影Top250的所有影片名称
1 实现代码:
# 豆瓣前Tap 250
import requests
from bs4 import BeautifulSoup
# 检查获取是否成功
def check(response):if not response.ok:print(f'请求失败,服务器错误\n状态码: {response.status_code}')exit() # 退出程序# 浏览器标识
head = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}# 存储中文电影名
tap250_movie_title = []
# 获取每一页中的电影名(从0到225,star以25为一个步长去增加)
for start in range(0, 226, 25):# 目标网址url = f"https://movie.douban.com/top250?start={start}&filter="# 获取网页信息response = requests.get(url, headers=head)# 检查是否成功获取check(response)# 存储HTML源码html = response.text# 解析HTML,并将返回的对象存至soupsoup = BeautifulSoup(html, "html.parser")# 提取出所有包含着“电影名称”的元素(标签),包含中文名字和原本语言名字(每个名字前都有'/')# 解释:返回的是可迭代对象(列表):找到所有class值为title的<span>元素 (参数1为要查找的标签;参数2为标签中的属性,"class" : "title"为一个键值对)all_titles = soup.find_all("span", attrs={"class": "title"})# print(all_titles) # 如果此时将 all_titles 打印出来,打印的是一个列表for title in all_titles:title_string = title.string # title.string 不要标签,只要标签中的文本内容# 只打印中文电影名:只有不含 '/' 的电影名,才不是原版语言电影名,即中文电影名,那就打印if '/' not in title_string:tap250_movie_title.append(title_string) # 电影名存储到列表中print('Tap电影如下:')
num = 0
for title in tap250_movie_title:if num % 25 == 0: # 如果一行25个了,则就换行(包括第一行)print()print(f'{num+1} ~ {num + 25}: ', end='\t') # 打印下一行的开头(表示第多少个电影)num += 1 # 累加以打印电影的个数print(f'{title}', end = ' ')
2 实现效果(输出内容如下)
1 ~ 25: 肖申克的救赎 霸王别姬 泰坦尼克号 阿甘正传 千与千寻 美丽人生 这个杀手不太冷 星际穿越 盗梦空间 楚门的世界 辛德勒的名单 忠犬八公的故事 海上钢琴师 三傻大闹宝莱坞 疯狂动物城 放牛班的春天 机器人总动员 无间道 控方证人 大话西游之大圣娶亲 熔炉 触不可及 教父 寻梦环游记 当幸福来敲门
26 ~ 50: 末代皇帝 哈利·波特与魔法石 龙猫 怦然心动 活着 蝙蝠侠:黑暗骑士 指环王3:王者无敌 我不是药神 乱世佳人 飞屋环游记 让子弹飞 哈尔的移动城堡 素媛 十二怒汉 海蒂和爷爷 猫鼠游戏 天空之城 摔跤吧!爸爸 鬼子来了 少年派的奇幻漂流 钢琴家 指环王2:双塔奇兵 大话西游之月光宝盒 死亡诗社 何以为家
51 ~ 75: 闻香识女人 绿皮书 大闹天宫 黑客帝国 指环王1:护戒使者 罗马假日 教父2 狮子王 天堂电影院 饮食男女 辩护人 搏击俱乐部 本杰明·巴顿奇事 美丽心灵 穿条纹睡衣的男孩 情书 窃听风暴 两杆大烟枪 哈利·波特与死亡圣器(下) 音乐之声 西西里的美丽传说 功夫 阿凡达 哈利·波特与阿兹卡班的囚徒 看不见的客人
76 ~ 100: 拯救大兵瑞恩 小鞋子 沉默的羔羊 飞越疯人院 布达佩斯大饭店 蝴蝶效应 禁闭岛 致命魔术 心灵捕手 低俗小说 超脱 哈利·波特与密室 摩登时代 喜剧之王 杀人回忆 致命ID 春光乍泄 一一 海豚湾 美国往事 加勒比海盗 红辣椒 七宗罪 唐伯虎点秋香 狩猎
101 ~ 125: 还有明天 幽灵公主 甜蜜蜜 蝙蝠侠:黑暗骑士崛起 7号房的礼物 寄生虫 天书奇谭 超能陆战队 爱在黎明破晓前 被嫌弃的松子的一生 第六感 爱在日落黄昏时 重庆森林 入殓师 剪刀手爱德华 断背山 未麻的部屋 菊次郎的夏天 勇敢的心 哈利·波特与火焰杯 借东西的小人阿莉埃蒂 茶馆 头脑特工队 时空恋旅人 消失的爱人
126 ~ 150: 无人知晓 倩女幽魂 完美的世界 阳光灿烂的日子 花样年华 驯龙高手 小森林 夏秋篇 天使爱美丽 新世界 傲慢与偏见 侧耳倾听 一个叫欧维的男人决定去死 怪兽电力公司 玩具总动员3 请以你的名字呼唤我 教父3 色,戒 幸福终点站 哪吒闹海 被解救的姜戈 小森林 冬春篇 九品芝麻官 釜山行 神偷奶爸 萤火之森
151 ~ 175: 喜宴 告白 玛丽和马克思 头号玩家 模仿游戏 大鱼 七武士 惊魂记 射雕英雄传之东成西就 血战钢锯岭 我是山姆 你的名字。 阳光姐妹淘 恐怖直播 黑客帝国3:矩阵革命 背靠背,脸对脸 心灵奇旅 电锯惊魂 三块广告牌 小丑 谍影重重3 达拉斯买家俱乐部 疯狂原始人 无间道2 绿里奇迹
176 ~ 200: 爱在午夜降临前 海街日记 上帝之城 风之谷 英雄本色 疯狂的石头 雨中曲 心迷宫 2001太空漫游 纵横四海 记忆碎片 末路狂花 卢旺达饭店 高山下的花环 无敌破坏王 小偷家族 冰川时代 恐怖游轮 东京教父 牯岭街少年杀人事件 魔女宅急便 岁月神偷 忠犬八公物语 荒蛮故事 遗愿清单
201 ~ 225: 大佛普拉斯 贫民窟的百万富翁 芙蓉镇 源代码 疯狂的麦克斯4:狂暴之路 你看起来好像很好吃 东邪西毒 可可西里 爆裂鼓手 城市之光 波西米亚狂想曲 花束般的恋爱 黑天鹅 爱乐之城 青蛇 白日梦想家 哈利·波特与死亡圣器(上) 终结者2:审判日 初恋这件小事 无耻混蛋 雨人 新龙门客栈 人工智能 机器人之梦 虎口脱险
226 ~ 250: 崖上的波妞 真爱至上 大红灯笼高高挂 千钧一发 罗生门 恋恋笔记本 彗星来的那一夜 哈利·波特与凤凰社 海边的曼彻斯特 火星救援 黑客帝国2:重装上阵 奇迹男孩 萤火虫之墓 战争之王 千年女优 步履不停 血钻 谍影重重2 蜘蛛侠:平行宇宙 魂断蓝桥 房间 攻壳机动队 冰雪奇缘 隐藏人物 谍影重重