爬虫的一些小技巧总结

一、在爬虫中,爬取的数据类型如下

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键可以搜索如下图

d5f2ced75a854b12b8564d70ce546d1a.png

 点击:95f411d26699418e886e3e4c8dafd339.png

点击.*可以用正则表达式,如果用正则表达解析数据,可以在这里尝试,可以看见匹配的数量,然后再写入代码中。

5.列表中嵌套元祖,如何快速找出元祖中的元素。

如:a=[(1,'as'),(2,'ajsh'),(781,'ajhsasa')]

04c07180d44744c2851321ae0209ac72.png

bcedd1fe514e49479e0f1f9bd71140da.png

用第二张图的方法,可以直接取出元素

6.遇到参数很多,加冒号很麻烦怎么办,如下图:

 6656f636412e4384804666a55d2423f1.png

 首先选中代码,按ctrl+r出现下图:72f08f93e4f0487ea429ac78243182a8.png

点击·*进入正则,写入下图:2611a7dd0a3f4c328900561e1ad14d5d.png 

代码是: (.*?): (.*)

'$1': '$2',

点击replaceall

结果展现:ce9bfcd0941b41519cee4857aba9985b.png

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,说不定可以找到终极目标是找到一个包能返回下面的界面

9aef166473dc4a23b8adcba836bd22b0.png

不同的网站,这个包找的地方不同,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

d5775599e56a42a4be7467a9ca85e77a.png

在终端输入: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的字母

如:

3b5668a3ddcd40d3995ff21362758cad.png

在逆向中哈希加密常用于表单参数的加密,通常是把表单全部合在一起,经过某种处理,然后丢给哈希算法。

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(想要复制的值)   

64451450f45b4b7c82409c587e4f3945.png

六、加密参数得来源

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处打上断点,因为这里会返回已经处理好的表单数据和密文。而且如果表单参数有加密,且有秘文,则大概率会放在一起去。

在逆向中,如果表单参数有很多个,可以先搜索参数内容,看是不是由其他的包返回的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习各种软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>