python实现豆瓣电影搜索并自动添加相关信息

1.豆瓣电影搜索

2.豆瓣电影信息自动添加

搜索

众所周知,豆瓣搜索有加密,得解密才行,还好网上众多大神都给破解了,那咱们拿来直接使用就行

相关代码仓库:xadmin-server/movies/utils/douban/search.py at movies · nineaiyu/xadmin-server (github.com) 

核心搜索并解密代码如下

import base64
import datetime
import plistlib
import re
import struct
from plistlib import FMT_BINARY, _BinaryPlistParser, _undefinedimport requests
import xxhash
from Cryptodome.Cipher import ARC4
from math import floordef _read_object(self, ref):"""read the object by reference.May recursively read sub-objects (content of an array/dict/set)"""result = self._objects[ref]if result is not _undefined:return resultoffset = self._object_offsets[ref]self._fp.seek(offset)token = self._fp.read(1)[0]tokenH, tokenL = token & 0xF0, token & 0x0Fif token == 0x00:result = Noneelif token == 0x08:result = Falseelif token == 0x09:result = True# The referenced source code also mentions URL (0x0c, 0x0d) and# UUID (0x0e), but neither can be generated using the Cocoa libraries.elif token == 0x0f:result = b''elif tokenH == 0x10:  # intresult = int.from_bytes(self._fp.read(1 << tokenL),'big', signed=tokenL >= 3)elif token == 0x22:  # realresult = struct.unpack('>f', self._fp.read(4))[0]elif token == 0x23:  # realresult = struct.unpack('>d', self._fp.read(8))[0]elif token == 0x33:  # datef = struct.unpack('>d', self._fp.read(8))[0]# timestamp 0 of binary plists corresponds to 1/1/2001# (year of Mac OS X 10.0), instead of 1/1/1970.result = (datetime.datetime(2001, 1, 1) +datetime.timedelta(seconds=f))elif tokenH == 0x40:  # datas = self._get_size(tokenL)result = self._fp.read(s)if len(result) != s:raise plistlib.InvalidFileException()elif tokenH == 0x60:  # ascii strings = self._get_size(tokenL)data = self._fp.read(s)if len(data) != s:raise plistlib.InvalidFileException()result = data.decode('ascii')elif tokenH == 0x50:  # unicode strings = self._get_size(tokenL) * 2data = self._fp.read(s)if len(data) != s:raise plistlib.InvalidFileException()result = data.decode('utf-16be')elif tokenH == 0x80:  # UID# used by Key-Archiver plist filesresult = plistlib.UID(int.from_bytes(self._fp.read(1 + tokenL), 'big'))elif tokenH == 0xA0:  # arrays = self._get_size(tokenL)obj_refs = self._read_refs(s)result = []self._objects[ref] = resultresult.extend(self._read_object(x) for x in obj_refs)# tokenH == 0xB0 is documented as 'ordset', but is not actually# implemented in the Apple reference code.# tokenH == 0xC0 is documented as 'set', but sets cannot be used in# plists.elif tokenH == 0xD0:  # dicts = self._get_size(tokenL)key_refs = self._read_refs(s)obj_refs = self._read_refs(s)result = self._dict_type()self._objects[ref] = resulttry:for k, o in zip(key_refs, obj_refs):result[self._read_object(k)] = self._read_object(o)except TypeError:raise plistlib.InvalidFileException()else:raise plistlib.InvalidFileException()self._objects[ref] = resultreturn result_BinaryPlistParser._read_object = _read_objectdef crypto_rc4(raw_data: bytes, sec_key: str):cipher = ARC4.new(sec_key.encode())rc4_bytes = cipher.encrypt(raw_data)return rc4_bytesdef search_from_douban(key):url = f'https://search.douban.com/movie/subject_search?search_text={key}&cat=1002'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',}res = requests.get(url, headers=headers)print(f"search douban url: {res.status_code} {res.content}")data = re.search(r'window.__DATA__ = "(.+?)"', res.text, flags=re.DOTALL).group(1)# print(data)i = 16a = base64.b64decode(data)s = floor((len(a) - 2 * i) / 3)u = a[s: s + i]raw_bytes = a[0:s] + a[s + i:]# print(u)sec_key = xxhash.xxh64_hexdigest(u, 41405)# print(sec_key)rc4_bytes = crypto_rc4(raw_bytes, sec_key)# print(rc4_bytes)pb_results = plistlib.loads(rc4_bytes, fmt=FMT_BINARY)results = []# print("最终结果为:")# print(pb_results)for x in pb_results:# print(1111, type(x), x)try:data = x.get(b'k')info = {'title': '', 'info': '', 'actor': '', 'url': ''}for s in data:if isinstance(s, list) and len(s) > 0 and s[0].get('title'):# results = []for x in s:results.append({'title': x['title'].replace('\u200e', '').strip(),'info': x.get('abstract'),'actor': x.get('abstract_2'), 'url': x.get('url')})# return resultsif isinstance(s, str):if 's_ratio_poster' in s and s.startswith('https://img'):info['s_ratio_poster'] = selif '\u200e' in s:info['title'] = s.replace('\u200e', '').strip()elif s.startswith('https://movie.douban.com'):info['url'] = selif ' / ' in s:if s.endswith('分钟'):info['info'] = selse:info['actor'] = sif info and info['title'] and info['url']:results.insert(0, dict(info.items()))except Exception as e:passreturn resultsif __name__ == '__main__':print(search_from_douban('流浪地球'))

 剩下的添加

 相关功能代码参考如下:nineaiyu/xadmin-server at movies (github.com)

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

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

相关文章

React中使用LazyBuilder实现页面懒加载方法一

前言&#xff1a; 在一个表格中&#xff0c;需要展示100条数据&#xff0c;当每条数据里面需要承载的内容很多&#xff0c;需要渲染的元素也很多的时候&#xff0c;容易造成页面加载的速度很慢&#xff0c;不能给用户提供很好的体验时&#xff0c;懒加载是优化页面加载速度的方…

AJAX进阶(重点)

目录 ◆ 同步代码和异步代码 ◆ 回调函数地狱和 Promise 链式调用 什么是回调函数地狱&#xff1f; Promise - 链式调用 什么是Promise链式调用&#xff1f; Promise 链式应用 &#xff08;重点&#xff09; ◆ async 和 await 使用 async函数和await_捕获错误 ◆ 事…

二分查找|详细讲解|两种写法

二分查找 目录 1 介绍2 例题引入3 “左闭右闭”写法4 “左闭右开”写法 1 介绍 二分查找适用于从一个递增或递减的有序数列中查找某一个值 因此&#xff0c;使用二分查找的条件是&#xff1a; 用于查找的内容从逻辑上来看是有序的查找的数量只能是一个而不是多个 在二分查…

RAG应用-七个最常见的故障点

近日&#xff0c;国外研究者发布了一篇论文《Seven Failure Points When Engineering a Retrieval Augmented Generation System》&#xff0c;探讨了在实际工程落地RAG应用过程中容易出的七类问题。 论文地址&#xff1a;https://arxiv.org/pdf/2401.05856.pdf 一、丢失内容&…

【Go-zero】手把手带你在goland中创建api文件并设置高亮

【Go-zero】手把手带你在goland中创建api文件并设置高亮 大家好 我是寸铁&#x1f44a; 总结了一篇手把手带你在goland中创建api文件并设置高亮解决方案的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 问题复盘 在使用go-zero 框架时&#xff0c;常常需要用到goctl 一键生成…

简单易用的购物车

实现了购物基本功能&#xff0c;那来修改一下就可以用&#xff0c;app,h5,小程序都可以 购物车插件 - DCloud 插件市场

会话技术复习笔记

一.登录校验的需求 什么是登录校验&#xff1f; 所谓登录校验&#xff0c;指的是我们在服务器端接收到浏览器发送过来的请求之后&#xff0c;首先我们要对请求进行校验。先要校验一下用户登录了没有&#xff0c;如果用户已经登录了&#xff0c;就直接执行对应的业务操作就可以…

数据结构——用Java实现二分搜索树

目录 一、树 二、二分搜索树 1.二叉树 2.二分搜索树 三、代码实现 1.树的构建 2.获取树中结点的个数 3.添加元素 4.查找元素 &#xff08;1&#xff09;查找元素是否存在 &#xff08;2&#xff09;查找最小元素 &#xff08;3&#xff09;查找最大元素 5.二分搜索…

合并有序链表---链表OJ---归并思想

https://leetcode.cn/problems/merge-two-sorted-lists/?envTypestudy-plan-v2&envIdtop-100-liked 将两个有序的链表合并为一个新的有序链表&#xff0c;那不就是和归并排序中最后合并的思想一样吗&#xff1f;只不过那里合并的是数组&#xff0c;这里合并的是链表。 首先…

StartAI宝藏功能——关键词解析

AIGC的同学们都有一个“世纪难题”——生图咒语。 想要生成高质量的图&#xff0c;关键词是至关重要地。关键词往往能决定一张图的成败&#xff01;当你看见一张戳中你审美的图&#xff0c;想模仿却不知如何下手&#xff0c;只能全网搜索生图咒语。 费事又费力&#xff0c;甚…

leetcode刷题(剑指offer) 50.Pow(x, n)

50.Pow(x, n) 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000示例 2&#xff1a; 输入&#xff1a;x 2.10000, n 3 输出&#x…

微信小程序|摇骰子

目录 简介设计与功能需求确定用户界面设计确定摇骰子动画效果确定随机数生成算法编码实现实现摇骰子动画测试与优化进行功能测试进行性能测试说明简介 制作一个摇骰子小程序是一个有趣且具有挑战性的项目。通过这个项目,你可以学习如何运用编程技术来模拟骰子的摇动和结果显示…

【LeetCode每日一题】56. 合并区间插入区间

一、判断区间是否重叠 力扣 252. 会议室 给定一个会议时间安排的数组 intervals &#xff0c;每个会议时间都会包括开始和结束的时间 intervals[i] [starti, endi] &#xff0c;请你判断一个人是否能够参加这里面的全部会议。 思路分析 因为一个人在同一时刻只能参加一个会…

Node.js-express

1.了解Ajax 1.1 什么是ajax Ajax的全称是Asynchronous Javascript And XML&#xff08;异步Js和XML&#xff09;. 通俗的理解&#xff1a;在网页中利用XMLHttpRequest对象和服务器进行数据交互的方式&#xff0c;就是Ajax 1.2 为什么要学习Ajax 之前所学的技术&#xff0c…

【git】git update-index --assume-unchanged(不改动.gitignore实现忽略文件)

文章目录 原因分析&#xff1a;添加忽略文件(取消跟踪)的命令&#xff1a;取消忽略文件(恢复跟踪)的命令&#xff1a;查看已经添加了忽略文件(取消跟踪)的命令&#xff1a; 原因分析&#xff1a; 已经维护的项目&#xff0c;文件已经被追踪&#xff0c;gitignore文件不方便修…

用可视化案例讲Rust编程3. 函数分解与参数传递

上一节我们在绘制面要素的时候&#xff0c;发现了函数功能体是三个不同步骤组成的&#xff1a; 读取文件获得geometry把geometry转变为绘图元素trace把绘图元素绘制到地图上 像我们上一节那样&#xff0c;把所有的功能都写在一个函数里面&#xff0c;这样的函数灵活性太差&am…

代理IP购买:选择按流量还是端口收费的代理?

​ 代理通常按以下两种标准之一收费&#xff1a;GB 或端口。但您应该选择哪一个&#xff1f;它们与其他产品有何不同&#xff1f;主要取决于您的需求&#xff0c;每种类型都有自己的优缺点&#xff0c;适合不同的情况。 在本文中&#xff0c;我们将详细分析每种类型&#xff0…

【VSCode】增加或减少一Tab的间隔

文章目录 示例 1&#xff1a;给 console 打印添加一 Tab 的间隔&#xff08;按下tab键即可&#xff09; // 原有的格式 if(a b){ console.log(true) }else{ console.log(false) }// 改变后的格式 if(a b){console.log(true) }else{console.log(false) }示例 2&#xff1a;给…

专有钉钉开发记录,及问题总结

先放几个专有钉钉开发文档 专有钉钉官网的开发指南 服务端(后端)api文档 前端api文档 前端开发工具下载地址 小程序配置文件下载地址 后端SDK包下载地址 专有钉钉域名是openplatform.dg-work.cn 开发记录 开发专有钉钉时有时会遇到要使用钉钉的api&#xff1b;通过 my 的方…

JavaWeb学习|Cookie

学习材料声明 所有知识点都来自互联网&#xff0c;进行总结和梳理&#xff0c;侵权必删。 引用来源&#xff1a;尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版 在此之前&#xff0c;复习一下如何创建项目 首先创建正常的Java项目&#xff0c;之后选择add framework…