python爬虫[简易版]

python爬数据[简易版]

对于每个网站的爬的原理基本是一样的,但是具体的代码写法的区别就在于爬的数据中解析出想要的数据格式:

以爬取有道词典中的图片为例:

第一步:打开网站,分析图片的数据源来自哪里,

https://dict-subsidiary.youdao.com/home/content?invalid=&previewEnvTest=

发现我们要的数据原来自这里,

{"data": {.........."secondList": [{"name": "网易有道词典APP","picture": "https://ydlunacommon-cdn.nosdn.127.net/4e7ca43db1a83f11c467105181e9badb.png","desc": "智能学习更高效","buttonList": [{"text": "下载","type": 0,"url": "https://cidian.youdao.com/download-app/"}]},{"name": "有道词典笔","picture": "https://ydlunacommon-cdn.nosdn.127.net/c30638638a393dc38464600caf4888fb.jpg","desc": "更专业的词典笔","buttonList": [{"text": "查看详情","type": 0,"url": "https://smart.youdao.com/dictPenX6Pro"}]},..........
}

接下来就是分析返回的数据,解析数据~拿出图片的url

response = requests.get(url, headers)
# response = request.urlopen(url).read()
# 处理数据json_load = json.loads(response.text)
# json_load = json.loads(response)
dt = json_load['data']
dumps = json.dumps(dt)
loads = json.loads(dumps)
listS = loads["secondList"]
arr = []
for i in listS:json_dumps = json.dumps(i)json_loads = json.loads(json_dumps)arr.append(json_loads["picture"])

爬取数据:

i = 0
for item in arr:requests_get=request.urlopen(item).read()png = "d:/PythonData/pic/" + str(i) + ".png"with open(png, "wb") as f:f.write(requests_get)i = i + 1

完整的代码:

from urllib import request
import re
import requests
import json
"""爬取有道词典的图片
"""
url = "https://dict-subsidiary.youdao.com/home/content?invalid=&previewEnvTest="
headers = {# User-Agent 用户代理 浏览器基本身份信息'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 ''Safari/537.36'
}
response = requests.get(url, headers)
# response = request.urlopen(url).read()
# 处理数据
json_load = json.loads(response.text)
# json_load = json.loads(response)
dt = json_load['data']
dumps = json.dumps(dt)
loads = json.loads(dumps)
listS = loads["secondList"]
arr = []
for i in listS:json_dumps = json.dumps(i)json_loads = json.loads(json_dumps)arr.append(json_loads["picture"])
i = 0
for item in arr:requests_get=request.urlopen(item).read()png = "d:/PythonData/pic/" + str(i) + ".png"with open(png, "wb") as f:f.write(requests_get)i = i + 1

example:

"""
# 导入数据请求模块 --> 第三方模块, 需要安装 pip install requests
# 导入正则模块 --> 内置模块, 不需要安装
"""
import requests
import re"""
1.
发送请求, 模拟浏览器对于url地址发送请求
- 模拟浏览器 < 反爬处理 > 请求头 < 字典数据类型 >
如果你不伪装, 可能会被识别出来是爬虫程序, 从而得到数据内容
可以直接复制粘贴 --> 开发者工具里面就可以复制- < Response[200] > 响应对象
Response: 中文意思 -->响应
<>: 表示对象
200: 状态码
表示请求成功
发送请求, 请求成功了分析请求url地址变化规律:
第一页: http: // www.netbian.com / dongman /
第二页: http: // www.netbian.com / dongman / index_2.htm
第三页: http: // www.netbian.com / dongman / index_3.htm
第四页: http: // www.netbian.com / dongman / index_4.htm"""
for page in range(2, 11):print(f'=================正在采集第{page}页的数据内容=================')# 请求图片目录页面urlurl = f'http://www.netbian.com/dongman/index_{page}.htm'# 伪装模拟成浏览器headers = {# User-Agent 用户代理 浏览器基本身份信息'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'}# 发送请求# 调用requests模块里面get请求方法, 对于url地址发送请求, 并且携带上headers请求头伪装, 最后用自定义变量名response接受返回的数据response = requests.get(url=url, headers=headers)"""
2.
获取数据, 获取服务器返回响应数据
response
网页源代码
response.text
获取响应文本数据 < 网页源代码 >
3.
解析数据, 提取我们想要的数据内容
- 图片ID
正则表达式Re
会1
不会0
调用re模块里面findall方法 --> 找到所有我们想要的数据
re.findall('找什么数据', '从哪里找') --> 从什么地方, 去匹配找什么样的数据内容
从
response.text < 网页源代码 > 里面
去找 < a
href = "/desk/(\d+).htm"
其中(\d +) 就是我们要的内容
\d + 表示任意数字
"""
# 提取图片ID --> 列表 <盒子/箱子> '29381' 是列表<箱子>里面元素<苹果>
img_id_list = re.findall('<a href="/desk/(\d+).htm"', response.text)
# for循环遍历, 把列表里面元素 一个一个提取出来
for img_id in img_id_list:# img_id变量<袋子> 给 img_id_list 列表<盒子> 里面 元素<苹果> 给装起来print(img_id)"""
4.
发送请求, 模拟浏览器对于url地址发送请求
- 请求
图片详情页页面url
http: // www.netbian.com / desk / {图片ID}.htm
5.
获取数据, 获取服务器返回响应数据
response
网页源代码
"""# 请求详情页链接 --> f'{img_id}' 字符串格式化方法link = f'http://www.netbian.com/desk/{img_id}.htm'# 发送请求response_1 = requests.get(url=link, headers=headers)# 获取数据内容 网页源代码 ---> 乱码了, 进行转码response_1.encoding = 'gbk'# 6. 解析数据, 提取我们想要的数据内容<图片链接/图片标题>img_url, img_title = re.findall('<img src="(.*?)" alt="(.*?)"', response_1.text)[0]# 7. 保存数据 --> 先获取图片数据内容img_content = requests.get(url=img_url, headers=headers).contentwith open('img\\' + img_title + '.jpg', mode='wb') as f:f.write(img_content)print(img_url, img_title)

python中的拷贝

import copy
from typing import override"""对于简单的 object,用 shallow copy 和 deep copy 没区别"""
"""构造一个类,然后构造一个实例,然后拷贝这个实例,就会发现,浅拷贝和深拷贝效果一样"""
"""如果是拷贝的list,深拷贝会拷贝list里面的内容,浅拷贝不会拷贝list里面的内容,而是拷贝list的地址""""""浅拷贝"""class Dog(object):def __init__(self, name):self.name = name"""如果要求名一样就是一个,那么需要重写下面的方法## def __eq__(self, other):#     return self.name == other.name## def __gt__(self, other):#     return self.name > other.name"""a = Dog("a")copy_obj_dog = copy.copy(a)deep_copy_obj_dog = copy.deepcopy(a)print(copy_obj_dog)  # <__main__.Dog object at 0x000002A0BFA56210>
print(deep_copy_obj_dog)  # <__main__.Dog object at 0x000002A0BFA56ED0>
print(copy_obj_dog == deep_copy_obj_dog)  # FALSE# 修改其中的一个,修改深拷贝的对象不影响源对象
deep_copy_obj_dog.name = "b"
print(copy_obj_dog.name)  # a
print(deep_copy_obj_dog.name)  # b
print(a.name)  # a
"""深拷贝"""class Cat:def __init__(self, name):self.name = namec = Cat("c")
copy_obj_cat = copy.copy(c)
deep_copy_obj_cat = copy.deepcopy(c)copy_obj_cat.name = "d"
print(copy_obj_cat.name)  # d
print(deep_copy_obj_cat.name)  # c
print(c.name)  # c# 可以看到浅拷贝跟深拷贝对于简单的obj对象,效果是一样的,都是拷贝到一个新对象中cat = Cat("list")
arr = [cat]
# 浅拷贝list~复杂对象 此时浅拷贝考的是地址
copy_arr = copy.copy(arr)
print(copy_arr == arr)  # Trueprint(arr[0])
print(copy_arr[0])# 修改list中的一个,修改浅拷贝的对象会影响源对象
copy_arr[0].name = "修改了"
print(arr[0].name)# 深拷贝~list 修改不会影响源对象
cat2 = Cat("list2")
arr2 = [cat2]deepcopy_arr2 = copy.deepcopy(arr2)
print(deepcopy_arr2 == arr2)print(arr2[0])
print(deepcopy_arr2[0])deepcopy_arr2[0].name = "change"
print(arr2[0].name)"""浅拷贝list中填充的是地址"""
"""深拷贝list中填充的是原始对象的副本"""class CustomCopy():"""自定义复制行为"""def __init__(self, name):self.name = namedef __copy__(self):print("copy")return CustomCopy(self.name)def __deepcopy__(self, memo):print("deepcopy")return CustomCopy(copy.deepcopy(self.name, memo))a = copy.copy(CustomCopy("a"))
ab = copy.deepcopy(CustomCopy("a"))
print(a == ab)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/13395.shtml

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

相关文章

操作系统磁盘管理类问题

例题&#xff1a;在磁盘上存储数据的排列方式会影响1/0服务的总时间。假设每个磁道被划分成10个物理块&#xff0c;每个物理块存放1个逻辑记录。逻辑记录R1,R2....R10存放在同一个磁道上&#xff0c;记录的排列顺序如下表所示&#xff1a; 假定磁盘的旋转速度为10ms/周&#xf…

VMware虚拟机-安装程序无法自动安装virtual machine......_windows server 2008 R2

系统版本&#xff1a;windows server 2008 R2 问题-安装程序无法自动安装virtual machine… 在使用虚拟机安装windows server 2008 R2系统中&#xff0c;安装VMware Tools工具安祖啊寄给你失败&#xff0c;提示安装程序无法自动安装virtual machine…&#xff0c;必须手动安装…

从源头到洞察:大数据时代的数据提取与分析实战指南

随着科技的飞速发展&#xff0c;大数据已经成为现代社会的核心驱动力之一。从商业决策到科学研究&#xff0c;从政策制定到个人生活&#xff0c;数据无处不在&#xff0c;影响着我们的每一个决策。然而&#xff0c;如何从海量的数据中提取有价值的信息&#xff0c;并转化为深刻…

List类

什么是 List 在集合框架中&#xff0c; List 是一个接口&#xff0c;继承自 Collection 。 Collection 也是一个接口 &#xff0c;该接口中规范了后序容器中常用的一些方法&#xff0c;具体如下所示&#xff1a; List 中提供了好的方法&#xff0c;具体如下&#xff1a; List…

Conda 常用命令大全

Conda 常用命令大全 配置源conda配置清华源pip配置清华源pip配置阿里源 环境管理创建一个新的虚拟环境列出虚拟环境激活虚拟环境退出虚拟环境删除虚拟环境复制某个虚拟环境 conda包管理列出全部包安装包卸载包 pip包管理列出全部包安装包卸载包 其他命令查询 conda 版本查看环境…

python发票真伪查验开发文档、票据OCR、数电票查验

想象一下&#xff0c;只需一行行简洁的代码&#xff0c;复杂繁琐的发票审核工作瞬间变得井然有序。翔云发票查验开发文档详尽易懂&#xff0c;即便是Python新手也能迅速上手&#xff0c;搭建起自己的发票真伪查验系统。无论是纸质发票的扫描图像&#xff0c;还是电子发票的数据…

C语言详解:数组指针

数组指针是指针 int* p[10] 这是指针数组的写法 &#xff0c;因为【】的优先级比*高&#xff0c; 所以为了解决优先级问题&#xff0c;加&#xff08;&#xff09; int(* p)[10]&arr;//数组的地址要存起来 说明p是指针&#xff08;首先与*结合&#xff09;&#xff0c…

哈希表法快速求解最长连续序列 | 力扣128题详细解析

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

Oracle 数据库 19c 选件和管理包 英文技术文档

都是英文的&#xff0c;点击链接可单独下载。点这里批量下载。 Database Options&#xff1a; 数据库选件或管理包数据表技术白皮书MultitenantData Sheet(12c)White PaperReal Application ClustersData Sheet(12c)White PaperActive Data GuardData Sheet(没找到)White Pap…

关于电源3(整流滤波电路)

整流滤波电路 框图 一共有四种整流电路 以下是自己参考别人的文章https://blog.csdn.net/zhuguanlin121/article/details/130653498?ops_request_misc%257B%2522request%255Fid%2522%253A%2522171582622316800215096518%2522%252C%2522scm%2522%253A%252220140713.130102334…

jenkins配置不同版本nodeJS,保姆级叫你配置

问题描述&#xff1a;公司jenkins被改了nodejs版本适配其他项目导致以前的项目构建失败&#xff0c;原因就是nodejs版本太高或太低导致&#xff0c;这里教大家不去更改服务器默认版本&#xff0c;当需要特殊版本直接在jenkins里配置即可。 过程 1、安装nodeJS插件 1.1点击管…

Linux中的nproc命令

2024年5月15日&#xff0c;周三上午 nproc 是一个在类 Unix 系统中使用的命令行实用程序&#xff0c;用于返回系统上可用的处理器核心数量。这个数字通常比物理 CPU 核心的数量要少&#xff0c;因为它可能排除了超线程核心或热插拔核心。nproc 命令读取 /proc/cpuinfo 文件来获…

怎么把照片变小做头像?多种方法教你图片改尺寸

现在在社交媒体平台或者是社交软件上&#xff0c;我们经常会去更改头像来展示自己&#xff0c;但是有时候我们拍摄的照片太大无法直接用作头像&#xff0c;这时候就需要去修改图片尺寸&#xff0c;将图片改大小到合适的数值才能使用&#xff0c;那么如何快速的将图片改大小呢&a…

Ansys Mechanical|中远程点的Behavior该如何设置?

Remote point是ANSYS mechanical中的一种常见节点自由度耦合建模形式&#xff0c;在转动装配体中的连接转动副、或者在施加远端约束及远端载荷的时候&#xff0c;我们经常用到远端单元来耦合一个面或者一条线。例如销轴似的滚动摩擦连接&#xff0c;如果我们希望将两个物体通过…

TCP实现文件传输以及下载

目录 1.上传文件思路 2.下载文件思路 3.上传文件代码 4.下载文件代码 5.运行格式 1.上传文件思路 上传文件就相当于客户端发送文件 步骤&#xff1a; 创建套接字连接服务器获取文件大小循环少量多次发送关闭文件和套接字 2.下载文件思路 下载文件就相当于服务器端接收…

layui+java前端传json后端接收

项目场景&#xff1a; layui前端使用复选框选择Table的数据传到java后端进行业务操作 问题描述 报错类型错误JSON转换接收失败的类型错误 解决方案&#xff1a; 分为前后端两种情况 先说前端的: 前端需要是集合转json下面是代码案例 主界面的table选择之后通过缓存传到子界…

JavaScript 实现敏感信息脱敏

JavaScript 实现敏感信息脱敏 银行卡号脱敏 要在 JavaScript 中对银行卡信息进行脱敏&#xff0c;可以使用字符串处理方法来替换敏感信息为特定的字符。以下是一个简单的示例代码&#xff0c;将银行卡号的中间数字用 “*” 替换&#xff1a; function desensitizeCardNumber…

小白git

克隆 &#xff1a;git clone 链接地址 如果没有.git文件的话&#xff1a;git init 切换分支&#xff1a;cd 目录 拉代码&#xff1a;git pull 查看你自己改了那些文件&#xff1a;git status 添加道本地暂存区&#xff1a;git add * 提交到远端&#xff1a;git commit …

吴恩达深度学习笔记:优化算法 (Optimization algorithms)2.9-2.10

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周&#xff1a;优化算法 (Optimization algorithms)2.9 学习率衰减(Learning rate decay) 第二门…

HP5V80、HP5V105、HP3V28电比例驱动柱塞泵放大器

HP5V80、HP5V105、HP3V28、HP3V45、HP3V60、HP3V80、HP3V125、HP3V140带电比例控制泵放大器&#xff0c;变排量泵的排量可通过由BEUEC比例放大器输出到比例电磁阀电流变化而进行调整&#xff0c;控制电流范围为300mA至800mA(24VDC)或600mA至1600mA(12VDC)。主要适合应用于工程机…