一、在爬虫中,爬取的数据类型如下
1.document:返回的是一个HTML文档
2.png:无损的图片,jpg:压缩后的图片,wbep:有损压缩,比png差,比jpg好
3.avg+xml图像编码字符串
4.script:脚本文件,依据一定格式编写的可执行的文件
5.gif:图像交换格式
6.xhr:返回的是json数据类型,在没有刷新整个网页的情况下,更新部分网页,也称Ajax请求
7.包后缀是css意味着其是css样式
二、
1.几个快捷进入开发者工具的指令:
打开开发者工具方法:F12(键盘)/fn+f12/ctrl+shift+i
2.列表转字符串方法:
str.join(列表)
如'\n'.join(selector.css('.noveContent p ::text').getall())
3.files = os.listdir(filename) # 获取文件夹下所有的小视频
with zipfile.ZipFile(filename+title+'.mp4',mode='w') as z:
z.write(content)
4.print(response.text)后,在下方,按住ctrl+f键可以搜索如下图

点击:
点击.*可以用正则表达式,如果用正则表达解析数据,可以在这里尝试,可以看见匹配的数量,然后再写入代码中。
5.列表中嵌套元祖,如何快速找出元祖中的元素。
如:a=[(1,'as'),(2,'ajsh'),(781,'ajhsasa')]


用第二张图的方法,可以直接取出元素
6.遇到参数很多,加冒号很麻烦怎么办,如下图:

首先选中代码,按ctrl+r出现下图:
点击·*进入正则,写入下图:
代码是: (.*?): (.*)
'$1': '$2',
点击replaceall
结果展现:
7.服务器端通常在接收 POST 请求时,根据请求头中的 Content-Type 字段来判断请求体的格式。如果 Content-Type 设置为 application/json,则服务器端会期望接收 JSON 格式的请求体数据。这在前后端分离的 Web 应用中比较常见,因为前端通常使用 JavaScript 或其他语言发送 JSON 格式的数据给后端。
以下是一些常见的情况,服务器端可能会要求 JSON 格式的请求体:
RESTful API: 许多基于 REST 架构的 Web 服务要求客户端发送 JSON 格式的数据给服务器端,以便执行 CRUD(创建、读取、更新、删除)操作。
前后端分离应用: 在前后端分离的应用中,前端通常发送 JSON 格式的数据给后端,后端再根据接收到的 JSON 数据进行处理。
某些框架或库要求: 某些后端框架或库可能要求客户端发送 JSON 格式的数据给服务器端,以便与服务器端进行交互。
Webhooks: 一些 Webhooks 可能要求发送 JSON 格式的数据给指定的 URL,以便触发某些操作。
在这些情况下,客户端通常需要将数据序列化为 JSON 格式,并将 Content-Type 设置为 application/json,以便服务器端能够正确解析请求体中的数据
服务器端通常在接收 POST 请求时,根据请求头中的 Content-Type 字段来判断请求体的格式。如果 Content-Type 设置为 application/x-www-form-urlencoded 或 multipart/form-data,则服务器端会期望接收表单格式的请求体数据。
以下是一些常见的情况,服务器端可能会要求表单格式的请求体:
传统 Web 表单提交: 在传统的 Web 应用中,用户通过 HTML 表单提交数据给服务器端时,通常使用表单格式的请求体数据。
文件上传: 当表单中包含文件上传字段时,通常使用 multipart/form-data 格式提交请求体数据。
某些框架或库要求: 某些后端框架或库可能要求客户端以表单格式提交数据给服务器端,以便与服务器端进行交互。
部分 API 接口: 一些 API 接口可能要求客户端以表单格式提交数据,而不是 JSON 格式,这取决于接口的设计和需求。
在这些情况下,客户端通常需要将数据编码为表单格式,并将 Content-Type 设置为 application/x-www-form-urlencoded 或 multipart/form-data,以便服务器端能够正确解析请求体中的数据。
8.对爬取到的的时间戳转变为正常时间:
import time
def get_time(ctime): # ctime为爬取到的时间戳
timeArray = time.localtime(int(ctime/1000))
otherStyleTime = time.strftime("%Y.%m.%d",timeArray)
return str(otherStyleTime)
#上面代码获取的是年月日,下面代码获取的小时,分,秒
import time
date = 1622263196000
def get_time(date):
time_array = time.localtime(int(date/1000))
real_time = time.strftime('%H:%M:%S', time_array)
return real_time
print(get_time(date))
9.selenium中的一些其他操作
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains #引入动作链
from selenium.webdriver.common.keys import Keys #引入键盘按钮
path = 'chromedriver.exe'
driver = webdriver.Chrome(path)
driver.find_element_by_css_selector().clear()# 清楚数据框中的内容
driver.find_element_by_css_selector().send_keys()
driver.find_element_by_css_selector().send_keys(Keys.ENTER)# 进行回车按钮操作
# 在12306网站操作时,输入信息必要操作,清楚内容,输入内容,以及点击回车按钮。
二、视频类爬虫总结
爬取短视频类型的数据一般步骤:
1.点击media,刷新,播放一个视频,会刷新一个包,点击发现是播放视频的包,
2.复制这个包url中的关键字,在搜索框中进行搜索,看有哪些包有关键字。
3.搜索后找到有play_url的包
4.看这个包的url,观察有什么规律
5.以糖豆视频为例,发现这个包的url有参数vid
6.查找参数在哪个位置
7.在xhr 动态加载中找到包,发现其中json数据中有vid的数据。
8.访问xhr 中的包获取vid数据,利用获取到的vid数据拼凑含有play_url的包的链接,访问这个链接,获取play_url
9.多页爬取,观察xhr 包的链接有什么规律,发现参数为页数,即可多页爬取
注意:访问视频play_url时,爬取短视频类型,headers中把user-agent,cookie,refer全部加上
爬取长视频的一般步骤:长视频通常以m3u8的格式存在,找包的过程与上述一致,找的是ts格式的文件,但一般存在于xhr下面。小技巧,若通过参数找不到就直接搜索m3u8,说不定可以找到终极目标是找到一个包能返回下面的界面

不同的网站,这个包找的地方不同,A站中搜索就可以找到,腾讯视频则先要找到一个含m3u8的包,从里面提取出一个链接,再访问这个链接,得到上面的界面。
下载时,要下载为ts的视频格式,多的一步是将文件合成。
可以将多个ts包合成一个下载代码:
with open('斗罗大陆.mp4',mode='ab') as f:
f.write(ts_content)
三、打包exe与制表库的使用
1.制表模块使用prettytable
from prettytable import PrettyTable
tb = PrettyTable() # 实例化一个对象
tb.field_names = ['序号','歌手','歌名'] # 设置字段名
tb.add_row([num,singer,song_name]) # 写入表格行
2. 将python文件打包成exe文件
首先,在项目中下载pyinstaller包pip install pyinstaller
然后在需要打包的python文件目录路径下输入cmd

在终端输入:pyinstaller -F 文件名.py
成功后会出现dit的文件夹,里面有exe的文件
四、文本分析与词云图
1.分析一段文本字符串中出现最多目标词语的次数:
def count_occurrences(text, target_words):
# 将文本转换为小写,以便统计时不区分大小写
text = text.lower()
# 初始化一个空字典,用于存储每个目标词语的出现次数
word_count = {}
# 遍历目标词语列表,统计每个词语的出现次数
for word in target_words:
# 使用字符串的 count 方法统计词语出现的次数,并存储到字典中
word_count[word] = text.count(word)
return word_count
# 统计目标词语 "老公" 和 "老婆" 在文本中的出现次数
text = "老公,我好想你,老婆,我也是啊,可是明天就要去见另一个老公了,我还没准备好呢老婆?"
target_words = ["老公", "老婆"]
result = count_occurrences(text, target_words)
print(result)
2.读取csv文件统计文本内容词语出现频数
import jieba
from collections import Counter
import pandas as pd
def count_words(text):
# 使用jieba进行分词
words = jieba.cut(text)
# 使用Counter进行词频统计
word_counts = Counter(words)
return word_counts #返回的是一个字典
def main():
# 读取文本文件
df = pd.read_csv('小红书评论.csv')
text = ' '.join(df['内容'].astype(str))
# 对文本进行词频统计
word_counts = count_words(text)
# 打印出现次数最多的前N个词语及其出现次数
top_n = 100 # 设置输出前N个词语
print("出现次数最多的{}个词语:".format(top_n))
for word, count in word_counts.most_common(top_n):
print("{}: {}".format(word, count))
if __name__ == "__main__":
main()
3. 做词云图:
from wordcloud import WordCloud, ImageColorGenerator
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
from os import path
d = r"C:\Users\86187\PycharmProjects\js逆向学习"
# 定义词频字典
word_freq = {
'就业': 20,
'港澳': 10,
'大学生': 15,
'政府': 14,
'考研': 78,
'考公': 56,
'国企': 90,
'深圳':190,
'人才引进':98,
'工资高':35,
'内地优惠':78,
'税收减免':55,
'港澳台政府':19,
'高校政策':90,
'薪资过万':70,
'国家':76,
'政府万岁':43,
'继续努力':89,
'找不到工作':88,
'中薪阶层':77,
'大学生就业难':22,
'985':23,
'待遇':54,
'深造':54,
}
background_Image = np.array(Image.open(path.join(d, "love.png")))
# 根据词频生成词云图
wordcloud = WordCloud(
background_color='white', # 设置背景颜色
mask=background_Image, # 设置背景图片
font_path='SimHei.ttf', # 若是有中文的话,这句代码必须添加,不然会出现方框,不出现汉字
max_words=200, # 设置最大现实的字数
max_font_size=150, # 设置字体最大值
random_state=3, # 设置有多少种随机生成状态,即有多少种配色方案
scale=5 # 设置生成的词云图的大小
)
wordcloud.generate_from_frequencies(word_freq)
# 显示词云图
image_colors = ImageColorGenerator(background_Image)
plt.axis("off")
plt.imshow(wordcloud.recolor(color_func=image_colors), interpolation='bilinear')
plt.show()
wordcloud.to_file(path.join(d, "generate_Love_star.png"))
五、逆向中的小技巧
object(l.g)可能是个对象也可能是个方法,就相当于l.g,(反括号前面的一定是个方法
网站处理信息流程:用户输入明文--》经过了一些方法--》加密函数--》发包函数--》浏览器发包函数
xhr断点定位,会定位在发包函数,我们好跟栈
利用关键字以及断点跟栈搜索js文件时候,一般排除vue,axiso,react,jquery等后缀的文件
关键词搜索的技巧 password=,password: {password:},.password
打断点的位置也有讲究,一般打在return,var和花括号末尾处,不能打在函数定义处,以及函数内部一行写成多行的位置。
stringify将对象转为json字符串
下面加密方法都属于哈希加密,看到类似的加密数据,就要联想到是否是下面的加密类型,且他们代码都有特征,就是会初始化数组,会有类似init之类的字母。
利用sha1加密的数据一般是40位的,且字母是a到f得字母(都是十六进制数)
利用sha256加密的数据一般是64位的,且字母是a到f得字母
利用sha3-256加密的数据一般是64位的,且字母是a到f得字母
利用sha512加密的数据一般是128位的,且字母是a到f得字母
利用MD5加密的数据一般是32位的 ,且字母是a到f的字母
如:

在逆向中哈希加密常用于表单参数的加密,通常是把表单全部合在一起,经过某种处理,然后丢给哈希算法。
jquery是一个库,一般用于发包的
1.加密代码:
import hashlib
string = ''#要加密的字符串
MD5 = hashlib.md5() #实例化一个对象
MD5.updata(string.encode('utf-8')) #加密
data = MD5.hexdigest() #加密后的data
2.时间戳获取:
import time
data_time = int(time.time()) #获取时间戳
3.在开发者工具中复制某一值:
copy(想要复制的值)
六、加密参数得来源
1.如登录接口密码逆向,表单中有加密参数,看一看登陆后返回几个包,有可能待加密的参数或者加密中的密钥,都在前面得包所返回的数据中。
2.如果跟栈中,遇到类似下面的代码,不要怀疑,加密参数就是从页面源代码中提取出来的。类似古诗文网登录和某医药登录平台登录。
$('#value(也可是其他属性)').val()
3. 如果加密参数是类似哈希算法得加密,那么可以考虑用标准库,而且加密的内容通常都是表单合在一起作某种操作。然后丢给哈希算法。
七、有异步如何跟栈分析
跟栈时,一直跟到异步前,如果参数已经加密了,继续跟到异步,变量作用域是不会变的。这时,在异步处打上断点,异步的形式一般是c = c.then(h[d++], h[d++]),打上断点,一般作用域内的内容都为空,若为空,则其中h中有许多回调方法,作用是生成对应的请求体、请求头、请求参数,优化代码传输。逐个进入方法,在结尾位置打上断点,如果加密参数出现,那么就是异步中的这个方法进行了加密。如果加密参数还不出现,则可能是异步中的其他函数生成。一般请求头中有加密参数,都是在第一第二个函数生成。
若c = c.then(h[d++], h[d++])打上断点后,作用域不为空,且加密参数已经出现,那么加密位置,可能不再回调函数内部。
以广东省公共教育资源平台做分析。

异步前headers中有加密参数,跟到异步requests栈,打上断点。此时看不到加密headers中的内容了,头部对象为空,不要慌。

进入h中的函数。

进入第一个函数,打上断点,(多点几次逃过下一次断点)发现headers中的参数又出现了,那么加密位置就是在这个回调函数内。

八、webpack分类与解决手段
基本步骤——复制加载器在pycharm中——导出加载器——删除初始化加载器代码——打印所需要的函数——将列表改为字典格式——复制函数——补充细枝末节,复制在浏览器中,看浏览器能否运行——接着复制在pycharm中运行——缺少什么环境就从浏览器中去打印,复制。
遇到的问题及解决思路。
如何确定总共有多少需要复制的函数模块

1.加载器和所有的需要的函数,全部放在一个自执行函数中
要做的就是加上这段代码,看具体用了哪些函数
window.mycode = ""
window.mycode +="\""+s+"\" : "+t[s]+","+"\n"
具体操作见某游戏登陆案例
2.webpack不在一起,头文件和子文件在不同的js文件中
首先找到头文件,改写成熟知的自执行函数样式,其缺少函数,我们要做的就是确定缺少哪些函数模块,然后去子文件中复制。这里会遇到一个问题,要复制的函数太多怎么办?怎么找到所有子文件?子文件太多怎么办,那就先复制最开始的子文件,看能不能成功,不能成功,再复制其他子文件!
要找到所有子文件,只要断点断后,打印
window.webpackJsonp

要复制的函数太多,解决办法是把头文件和子文件全部复制到一起,在pycharm中,折叠好格式,然后复制到浏览器中,在浏览器中运行,再运用上面的代码,会打印出所有需要的函数模块,然后删除所有的子文件,把打印的函数模块放在头文件中。具体操作见天翼云登录。
头文件
九、反爬破解手段
1.使用假user-agent
from fake_useragent import UserAgent
user_agent = UserAgent()
random_user_agent = user_agent.random #得到假的请求头
2.请求头中加上refer()(视频类爬取中常见,必须加,不然返回很短的视频),加上cookie
七、加密解密判断js代码步骤
首先判断参数是不是加密的,还是由别的包返回的,参数很多的情况下,大概率部分参数没用,或由别的包返回。如微博表单中的max_id是由前一个包返回的。
如果数据包总是前面跟着一个包,这个包有很大的作用,如果参数很多,可能部分参数是由前面的包返回的。如steam登陆逆向。
在解密中:如果秘文前有参数,直接搜索参数。没有的话,搜索decrypt(,如果还没有就跟栈调试
在表单加密中:如果有参数,直接搜索参数。如果没有,就跟栈调试,跟栈时,在apply或send处打上断点,因为这里会返回已经处理好的表单数据和密文。而且如果表单参数有加密,且有秘文,则大概率会放在一起去。
在逆向中,如果表单参数有很多个,可以先搜索参数内容,看是不是由其他的包返回的。


511

被折叠的 条评论
为什么被折叠?



