爬虫的一些小技巧总结

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

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"))

五、逆向MD5加密和时间戳获取

利用MD5加密的数据一般是32位的 ,如:

3b5668a3ddcd40d3995ff21362758cad.png

在逆向中MD5加密常用于表单参数的加密,大概率是某一个参数的加密。

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

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

 

 

 

 

 

 

 

 

 

  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

努力学习各种软件

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

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

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

打赏作者

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

抵扣说明:

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

余额充值