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

爬虫练习——动态网页的爬取(股票和百度翻译)

动态网页也是字面意思:实时更新的那种

还有就是你在股票这个网站上,翻页。他的地址是不变的

是动态的加载,真正我不太清楚,只知道他是不变的。如果用静态网页的方法就不可行了。

静态网页的翻页,是网址是有规律的。

还有就是:
在百度翻译中你总是在百度翻译一个网站上 ,并没有因此而改变。(意思就是不是查一个单词,换一个网址)


正文开始了哈:

      先来看成品和代码;

 如果想要其他东西,只要改对应的地方。就可以拿到对于的数据

import os
import requests
import re
import jsonwenjian = input("您要保存的文件名:")
img_path = f"./{wenjian}/"  # 指定保存地址
if not os.path.exists(img_path):print("您没有这个文件为您新建一个文件:")os.mkdir(img_path)
else:print(f"您有这个文件夹,将为您保存在“{wenjian}”中")
count=0
url = "https://63.push2.eastmoney.com/api/qt/clist/get?"hearders = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0'
}
#for i in range(1,281,1):
for i in range(1,281,1):count+=1params = {'cb': 'jQuery1124010908871949611432_1707493179217','pn': f'{i}','pz': '20','po': '1','np': '1','ut': 'bd1d9ddb04089700cf9c27f6f7426281','fltt': '2','invt': '2','wbp2u': '|0|0|0|web','fid': 'f3','fs': 'm:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048','fields': 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152','_': '1707493179252'}resqonse = requests.get(url,headers=hearders,params=params).text#print(resqonse)obj = re.compile(r"jQuery1124010908871949611432_1707493179217\((?P<json>.*?)\);")#给正则表达式的匹配的东西起个名字,叫json(?P<name>.*?)content = obj.search(resqonse).group('json')#在reqonse中搜索json的正则表达式#print(content)#print(f"第一次拿到的是content他的类型为{type(content)}")#转换成字典dic = json.loads(content)#print(dic)#print(f"改为字典为dic类型为{type(dic)}")#拿数据diff = dic['data']['diff'] #想要拿名字和股票编号。他们在data里的diff中for i in diff:name = i['f14']num = i['f12']#print(f"他的名字是:   {name}——{num}")end = name+'-------'+num+"\n"f = open(f"{img_path}{wenjian}.txt", 'a')f.write(end)print(f"第{count}页打印完成")

一般在XHR和JS文件中找到想要的数据 

要加入params和headers你会发现页数的改变是跟着 params中的'pn'在变,所以在页数改变的同时,'pn'也再改变。


上述代码中,加入新东西的是---Json

Json模块提供了四个功能:dumps、dump、loads、load,用于字符串 和 python数据类型间进行转换。

1.dumps和dump:

dump比Dumps多了一个操作,对于文件的写入。改为数据类型然后写入文件

# fp = open(f'{img_path}.txt', 'w',encoding='utf-8')
# json.dump(dic,fp=fp,ensure_ascii=False),中文的写入

2.毕竟是学习,就截屏了做个笔记。

import jsona="[1,2,3,4]"
b='{"k1":1,"k2":2}'#当字符串为字典时{}外面必须是''单引号{}里面必须是""双引号print (json.loads(a) )
[1, 2, 3, 4]print (json.loads(b) )
{'k2': 2, 'k1': 1}

 上面这个就很简单了到目前来说,简单指的是可以看懂!!!

面还有一个关于给自己正则表达式找到的起名字的写法,代码后面我有注释,不再多说!!!


下面是百度翻译的读取,顺便做了个翻译系统:

这个我就是多查了计次。

import json
import requests
import os
Myflag=1
img_path = '百度翻译'
img_path = f"./{img_path}/"  # 指定保存地址
if not os.path.exists(img_path):print("您没有这个文件为您新建一个文件---")os.mkdir(img_path)
else:print(f"百度翻译——结果为您保存在{img_path}文件夹中")
url = "https://fanyi.baidu.com/sug"
while Myflag!="0":wenjian = input("您要查询的单词是:")header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0'}data = {'kw':f'{wenjian}'}response = requests.post(url = url,headers = header,data = data)dic = response.json()data = dic['data']print(f"您所查询的{wenjian}的意思是:")for i in data:data = i['k']translate = i['v']end=data+'————————'+translate+'\n'ending = "\n\n\n================================================\n\n\n\n"print(f'{data}————————{translate}')f = open(f"{img_path}{wenjian}.txt", 'a')f.write(end)f = open(f"{img_path}{wenjian}.txt", 'a')ending = "\n\n\n================================================\n\n\n\n"f.write(ending)print("保存完成")Myflag = input("退出选‘0’,如果想退出请按任意键:")print("您退出单词查询")# fp = open(f'{img_path}.txt', 'w',encoding='utf-8')
# json.dump(dic,fp=fp,ensure_ascii=False)

总体来说,要找清楚,你要查询的请求方式。这个为post,到现在用过的请求方式为get。

post中要加入data!!!也就是百度翻译的要翻译的内容!!!

会发现这里没有用json转换一下,因为这个本事得到的是一个‘dic’的

而上一个用正则表达式得到的名字为json的东西是str,要改为dic,然后分析文件

上面写入文件的操作在我前面有写到,前面的文章。多看几个就会了。!!!

新年快乐!!!!

相关文章:

  • Netty应用(五) 之 Netty引入 EventLoop
  • 基于Vue的移动端UI框架整理
  • 内网安全-内网穿透
  • Stable Diffusion 模型下载:Disney Pixar Cartoon Type B(迪士尼皮克斯动画片B类)
  • vue+springboot前后端视频文件等的上传与展示(基于七牛云)
  • Elasticsearch:混合搜索是 GenAI 应用的未来
  • Leetcode 300 最长递增子序列
  • 【Java万花筒】加速Java应用程序:探索性能优化的利器
  • 基于华为云欧拉操作系统(HCE OS)构建HCE OS基础镜像
  • 【Redis笔记】分布式锁及4种常见实现方法
  • vue-生命周期+工程化开发(三)
  • C++ //练习 6.4 编写一个与用户交互的函数,要求用户输入一个数字,计算生成该数字的阶乘。在main函数中调用该函数。
  • UDP端口探活的那些细节
  • 第69讲后端登录逻辑实现
  • 力扣hot100 -- 双指针
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • AngularJS指令开发(1)——参数详解
  • exports和module.exports
  • isset在php5.6-和php7.0+的一些差异
  • laravel with 查询列表限制条数
  • Material Design
  • mysql 5.6 原生Online DDL解析
  • scala基础语法(二)
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • vue数据传递--我有特殊的实现技巧
  • XML已死 ?
  • 工作手记之html2canvas使用概述
  • 机器学习 vs. 深度学习
  • 漂亮刷新控件-iOS
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • HanLP分词命名实体提取详解
  • Java总结 - String - 这篇请使劲喷我
  • #传输# #传输数据判断#
  • (1)(1.13) SiK无线电高级配置(五)
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET 服务 ServiceController
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET使用存储过程实现对数据库的增删改查
  • @NestedConfigurationProperty 注解用法
  • @Repository 注解
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • [AIGC 大数据基础]hive浅谈
  • [AIGC] 如何建立和优化你的工作流?
  • [android] 手机卫士黑名单功能(ListView优化)
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [FTP]pureftp部署和优化
  • [HEOI2013]ALO
  • [IE技巧] 如何让IE 启动的时候不加载任何插件
  • [json]定义、读写
  • [JS设计模式]Prototype Pattern