一、数据来源分析
1、明确需求
明确采集网站已经数据内容
- 网站:www.taobao.com/
- 数据:商品内容
2、抓包分析
通过浏览器开发者工具分析对应的数据位置
- 打开开发者工具
option+command+I
或者 右键在网页点击检查-选择network(网络) - 刷新网页 更新网页数据
- 通过关键字搜索找到对应的数据位置 需要什么数据就搜索什么数据,具体参考如下截图
数据包地址 :h5api.m.taobao.com/h5/mtop.rel...
Sign加密参数-逆向分析
开发者工具关键字搜索
image-20241020234321875
markdown
位置-index.js 分析sign参数
1. 标准md5,可以用python代码直接复现即可
2. 魔改MD5,扣js代码c函数方法扣出来
具体加密分析请查看这篇文章:- 【爬虫JS逆向-工具篇】浏览器内存漫游加密参数Hook实战教程
二、代码实现步骤
1、发送请求
模拟浏览器对于url地址发送请求
针对于需要登陆账号才能看到数据网站:
-携带登陆账号之后cookie进行访问请求
模拟登陆:需要逆向账号/密码加密参数/ 需要进行验证识别(逆向)
针对某些网站数据采集:多准备账号
模拟浏览器
bash
使用开发者工具 ->网络->点击对应数据包 -> 标头->请求标头
常用伪装参数:cookie/referer/ua/...
需要注意代码格式:字典形式
请求网址
ini
# 抓包分析到的请求链接地址
url = 'https://h5api.m.taobao.com/h5/mtop.relationrecommend.wirelessrecommend.recommend/2.0'
发送请求
python
"""发送请求"""
# 模拟浏览器
headers = {
# cookie 用户信息,常用于检测是否有登陆账号
'cookie': 't=7be5e01a91d917d153ef1d4e5ea24791',
# 用户代理,浏览器的基本信息
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)'
}
# 请求网站
url = 'https://h5api.m.taobao.com/h5/mtop.relationrecommend.wirelessrecommend.recommend/2.0'
# 请求参数
data = {
'jsv': '2.7.4',
'v': ' 2.0',
'timeout': ' 10000',
'type': ' jsonp',
'dataType': ' jsonp',
}
# 发送请求
response = requests.get(url=url, params=data, headers=headers)
2、获取数据
response.text
获取响应的文本数据
*
response.json()
获取响应的json数据-字典数据或者列表数据 必须是完整的/标准的json数据格式 {'A':'B','info':{'c':'D'}} 〔{'A':'B'}, 'c': "D'}] 如果响应数据 Xxx({'A':'B',"info':{'c':'D'}})不是标准json数据格式 如果你获取json数据报错了 1. 先获取文本数据内容
*
response.content
获取响应的二进制数据-例如图片-音视频文件或者其他文件
反扒基本情况
当我们获取数据时候: 1.返回了数据,但是数据不是我们想要的 2.没有返回数据,返回空白面板 解决方法: 1. 考虑请求头伪装是否不够 -添加多个请求头参数字段 2. 是否采集频率过快 过高,导致有IP异常/账号异常/验证码 -刷新网页,看是否可以正常访问 3.是否存在加密参数(请求头参数加密/请求参数加密) -加密参数逆向分析
3、解析数据
python
"""解析数据"""
data = response.json()
default_data = data['page_params']['products_info']['cart_by_delivery_type']['default']
# key 字段名不是固定的,先过去动态字段名列表
keyList = default_data.keys()
print(keyList)
# 需要的列表数据
itemArray = []
# 根据字段名获取数据添加到集合中
for keyItem in keyList:
itemArray.extend(default_data[keyItem])
4、保存数据
ruby
# 遍历列表数据,保存数据到csv中
for item in itemArray:
line_main = item['line_main']
dit = {
'mrg-btm-xs href':line_main['link'],
'card-v2-badge-cmp':line_main['special_discount_badge'],
'average-rating':'4.75',
'product-new-price':line_main['reduced_price_info']['initial_price'],
'name':line_main['name'],
'max_quantity':line_main['max_quantity'],
'delivery_vendor_id':line_main['delivery_vendor_id']
}
# 数据保存到 csv 中
csv_writer.writerow(dit)
pprint.pprint(dit)
生成文档对应的数据
image-20241021152036249
完整代码:
python
import json
import re
import requests
import hashlib
import csv
import pprint
import datetime
file_name = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
# 创建文件夹
f = open(f"data_{file_name}.csv", mode='w', encoding='utf-8', newline='')
# 字典写入方法
csv_writer = csv.DictWriter(f, fieldnames=['mrg-btm-xs href',
'card-v2-badge-cmp',
'average-rating',
'product-new-price',
'name',
'max_quantity',
'delivery_vendor_id',
])
# 写入表头
csv_writer.writeheader()
"""模拟浏览器"""
headers = {
'Cookie':'ltuid=2429402282588876002; EMAGUUID=1729471081-2659022946-55620.868',
'User-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)',
'Referer':'https://www.emag.ro/cart/products?ref=cart',
}
"""请求地址"""
url = 'https://www.emag.ro/cart/products?source=front'
"""发送请求"""
response = requests.get(url=url,headers=headers)
"""解析数据"""
data = response.json()
default_data = data['page_params']['products_info']['cart_by_delivery_type']['default']
# key 字段名不是固定的,先过去动态字段名列表
keyList = default_data.keys()
print(keyList)
# 需要的列表数据
itemArray = []
# 根据字段名获取数据添加到集合中
for keyItem in keyList:
itemArray.extend(default_data[keyItem])
"""提取数据"""
for item in itemArray:
line_main = item['line_main']
dit = {
'mrg-btm-xs href':line_main['link'],
'card-v2-badge-cmp':line_main['special_discount_badge'],
'average-rating':'4.75',
'product-new-price':line_main['reduced_price_info']['initial_price'],
'name':line_main['name'],
'max_quantity':line_main['max_quantity'],
'delivery_vendor_id':line_main['delivery_vendor_id']
}
# 数据保存到 csv 中
csv_writer.writerow(dit)
pprint.pprint(dit)