2024.4.16 Python爬虫复习day04

news/2024/10/23 9:39:00/

day04_爬取图片和数据

1.爬虫入门

知识点:

网络爬虫 : (又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。爬虫步骤 :1.准备有效的URL2.发送请求,获取响应对象3.从响应对象中提取数据4.检索自己想要的数据5.数据保存或者数据可视化requests模块: 模拟人去浏览器中发送请求给web服务器1.导包2.变量接收响应对象 = requests.get(url)

示例:

"""
安装requests模块
pip install requests
"""
# 1.导包
import requests# 2.准备有效URL
url = 'http://www.baidu.com/'
# 3.使用requests发送请求,或者Response对象
res = requests.get(url)
print(res)
# 4.从Response对象中提取数据
# 获取url
print(res.url)
# 获取状态码
print(res.status_code)
# 获取头
print(res.headers)
# 获取cookies
print(res.cookies)
# 获取编码
print(res.encoding)
# 修改编码
# res.encoding = 'utf8'
# print(res.encoding)
# 获取文本
# print(res.text)
# 获取内容,默认二进制需要使用decode()解码
print(res.content.decode())

2.web服务器:

前提: 复制source资源到项目中

# 1.导包
from fastapi import FastAPI
from fastapi import Response
import uvicorn# 2.创建对象
app = FastAPI()# 3.使用对象接收浏览器请求,并且使用对象给浏览器响应资源
# 注意: get中传入请求的资源路径
@app.get('/')
def func():with open('source/html/index.html', 'rb') as f:data = f.read()res = Response(data)return res@app.get('/{html_name}')
def func(html_name: str):with open(f'source/html/{html_name}', 'rb') as f:data = f.read()res = Response(data)return res@app.get('/images/{img_name}')
def func(img_name: str):with open(f'source/images/{img_name}', 'rb') as f:data = f.read()res = Response(data)return res@app.get('/video/{vi_name}')
def func(vi_name: str):with open(f'source/video/{vi_name}', 'rb') as f:data = f.read()res = Response(data)return res# 4.启动服务器(指定fastapi对象,主机地址,端口号)
uvicorn.run(app,host='127.0.0.1',port=9091)# 浏览器可以通过: http://127.0.0.1:9091

3.爬取图片

爬取图片方式1:

核心知识点:

​ 爬虫相关知识点

​ 字符串切割方法: split()

正则表达式match匹配

​ 列表的定义和遍历

​ if判断

​ 枚举函数自动生成从0开始的编号: enumerate()

​ 文件操作相关知识点

# 1.导包
import requests
import re# 2.准备要爬取数据的页面有效url
url = 'http://127.0.0.1:9091/index.html'# 3.requests发送请求,获取响应对象
response = requests.get(url)# 4.content从响应对象中提取数据
html_str = response.content.decode()# 5.正则表达式从页面数据中匹配所有图片路径
# 把每一行放到列表中
html_list = html_str.split('\n')
# print(html_list) # ['    <img src="../images/0.jpg" width="350px" height="160px" style="margin-top:100px" >']
# 提前定义空列表用于存储图片路径
img_list = []
# 遍历列表依次匹配每一行数据
for line in html_list:data = re.match('.*<img src="(.+?)"', line)# 如果匹配成功,把路径存储起来if data:img_list.append(data.group(1))
# 循环外测试图片路径是否爬取到
print(img_list)# 6.拼接图片url,并且批量发送请求
base_url = 'http://127.0.0.1:9091'
# enumerate给容器中每个元素生成对应的从0开始的编号
# 遍历图片路径列表
for i, img_path in enumerate(img_list):# 拼接图片urlimg_url = base_url + img_path[2:]# 发送请求获取响应对象r = requests.get(img_url)# 从对象中获取资源data = r.content# 7.保存所有图片到本地with open(f'load/{i}.jpg', 'wb') as f:f.write(data)print(f"{i}.jpg保存成功!")

爬取图片方式2:

核心知识点:

​ 爬虫相关知识点

正则表达式findall匹配

​ 列表的遍历

​ 枚举函数自动生成从0开始的编号: enumerate()

​ 文件操作相关知识点

# 1.导包
import requests
import re
# 2.准备有效的url
url = 'http://127.0.0.1:9091/'
# 3.发送请求,获取响应对象
response = requests.get(url)
# 4.从响应对象中提取数据
html_str = response.content.decode()
# print(html_str)
# 5.正则表达式匹配想要的数据
img_list = re.findall('<img src="(.+?)" ', html_str)
print(img_list)
# 6.遍历图片列表,拼接url,批量发送请求获取资源
# 定义基础url
base_url = 'http://127.0.0.1:9091/'
for i,img_path in enumerate(img_list):# 拼接图片urlimg_url = base_url + img_path[3:]# 批量发送请求获取资源r = requests.get(img_url)# 从响应对象中提取数据data = r.content# 7.保存数据with open(f'load/图片/{i}.jpg', 'wb') as f:f.write(data)

4.爬取视频实战:

# 1.导包
import requests
import re
# 2.准备有效的url
url = 'http://127.0.0.1:9091/video.html'
# 3.发送请求,获取响应对象
response = requests.get(url)
# 4.从响应对象中提取数据
html_str = response.content.decode()
print(html_str)
# 5.正则表达式匹配想要的数据
video_list = re.findall('<source src="(.+?)" ', html_str)
print(video_list)
# 6.遍历图片列表,拼接url,批量发送请求获取资源
# 定义基础url
base_url = 'http://127.0.0.1:9091/'
for i,video_path in enumerate(video_list):# 拼接图片urlvideo_url = base_url + video_path[3:]# print(video_url)# 批量发送请求获取资源r = requests.get(video_url)# 从响应对象中提取数据data = r.content# 7.保存数据with open(f'load/视频/{i}.mp4', 'wb') as f:f.write(data)

5.爬取文本

爬取文本方式1:

核心知识点:

​ 爬虫相关知识点

​ 字符串切割方法: split()

正则表达式match匹配

​ 列表的定义和遍历

​ if判断

list(zip(列表1, 列表2)) : 把两个列表中数据合并为 [(),(),…]

​ 文件操作相关知识点

# 1.导包
import requests
import re# 2.准备有效的url
url = 'http://127.0.0.1:9091/gdp.html'
# 3.发送请求,获取响应对象
response = requests.get(url)
# 4.从响应对象中提取数据
html_str = response.content.decode()
print(html_str)
# 5.检索自己想要的数据
# 根据\n切割,把每行数据放到列表中
html_list = html_str.split('\n')
# 提前定义空列表,存储所有国家
country_list = []
gdp_list = []
# 遍历列表获取每行数据
for line in html_list:# 依次在每行数据中检索国家data = re.match('.*<a href=""><font>(.+)</font>.*', line)if data:country_list.append(data.group(1))# 依次在每行数据中检索gdp多少亿元data = re.match('.*¥(.+)亿元.*', line)if data:gdp_list.append(data.group(1))
# 验证是否爬取到数据
print(country_list)
print(gdp_list)
# 变成列表嵌套元组方式
# 注意: zip功能就是把两个列表中元素一一对应成组
gdp_data_list = list(zip(country_list, gdp_list))
# 6.保存数据
with open('load/文件/gdp.txt', 'w', encoding='utf8') as f:# 注意: write只能写字符,需要使用str转换f.write(str(gdp_data_list))

爬取文本方式2:

核心知识点:

​ 爬虫相关知识点

正则表达式findall匹配

正则表达式标志位修饰符: re.S

​ 文件操作相关知识点

# 1.导包
import requests
import re# 2.准备有效的url
url = 'http://127.0.0.1:9091/gdp.html'
# 3.发送请求,并且获取响应对象
response = requests.get(url)
# 4.从响应对象中提取数据
html_str = response.content.decode()
# print(html_str)
# 5.检索自己想要的资源
gdp_data_list = re.findall('<a href=""><font>(.+?)</font>.*?¥(.+?)亿元', html_str, re.S)
print(gdp_data_list)
# 6.保存数据
with open('load/文件/gdp.txt', 'w', encoding='utf8') as f:f.write(str(gdp_data_list))
print('gdp数据保存成功!')

http://www.ppmy.cn/news/1418651.html

相关文章

大语言模型总结整理(不定期更新)

《【快捷部署】016_Ollama&#xff08;CPU only版&#xff09;》 介绍了如何一键快捷部署Ollama&#xff0c;今天就来看一下受欢迎的模型。 模型简介gemmaGemma是由谷歌及其DeepMind团队开发的一个新的开放模型。参数&#xff1a;2B&#xff08;1.6GB&#xff09;、7B&#xff…

基于51单片机的无线病床呼叫系统设计—LCD1602显示

基于51单片机的无线病床呼叫系统 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.病人按下按键&#xff0c;LCD1602显示对应的床位号&#xff1b; 2.多人同时呼叫&#xff0c;显示屏同时显示&#xf…

Python根据主播直播时间段判定订单销售额归属

写在前面&#xff1a;最近在群里看到一个这样的直播电商的场景觉得还是挺有趣的&#xff0c;于是就想用Python来实现。 需求描述&#xff1a;根据主播直播时间段结合销售订单的付款时间判断所属销售的归属 生成主播在线直播时间段数据 from datetime import datetime, time…

【C++】模拟list

list的模拟真的很震撼&#xff0c;第一次学习时给我幼小的心灵留下了极大地冲击 接下来我们一起看看list模拟究竟是怎样一回事 目录 节点的封装&#xff1a;list类的实现&#xff1a;私有成员变量&#xff1a;构造函数&#xff1a;push_back && pop_back: 迭代器类的实…

从输入URL到页面发生了什么

从输入URL到页面加载完成&#xff0c;涉及了许多步骤和技术。这是一个简化的过程&#xff1a; 解析URL&#xff08;Uniform Resource Locator&#xff09;&#xff1a; 浏览器解析用户输入的URL&#xff0c;将其分解为不同的部分&#xff0c;如协议&#xff08;例如HTTP&#x…

【vs2019】window10环境变量设置

【vs2019】window10环境变量设置 【先赞后看养成习惯】求关注点赞收藏&#x1f60a; 安装VS2019时建议默认安装地址&#xff0c;最好不要改动&#xff0c;不然容易出问题 以下是安装完VS2019后环境变量的设置情况&#xff0c;C:\Program Files (x86)\Microsoft Visual Studi…

Python-VBA函数之旅-delattr函数

目录 1、 delattr函数&#xff1a; 1-1、Python: 1-2、VBA&#xff1a; 2、相关文章&#xff1a; 个人主页&#xff1a;https://blog.csdn.net/ygb_1024?spm1010.2135.3001.5421 delattr函数在Python中具有广泛的应用场景&#xff0c;主要用于动态地管理对象的属性。常用…

Flutter第七弹 网格列表GridView

1) Flutter提供了网格列表&#xff0c;怎么设置列数&#xff1f; 2&#xff09;怎么初始化每个列表项Item&#xff1f; 一、GridView简介 Flutter也存在网格列表组建GridView&#xff0c;用于展示多行多列的列表。 1.1 GridView构建 采用GridView.count() 进行构建 1.2 Gr…