一、在爬虫中,爬取的数据类型如下
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"))
五、逆向MD5加密和时间戳获取
利用MD5加密的数据一般是32位的 ,如:
在逆向中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(想要复制的值)
六、反爬破解手段
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处打上断点,因为这里会返回已经处理好的表单数据和密文。而且如果表单参数有加密,且有秘文,则大概率会放在一起去。
在逆向中,如果表单参数有很多个,可以先搜索参数内容,看是不是由其他的包返回的。