本期以某心优选小程序为例(仅供学习,不可作为商业用途!)
提示:FD高阶操作+Python爬虫
前期准备:
1、 FD代理抓取手机Https
2、 JavaScript基础语法
3、 Python爬虫基本
4、 学习Flask的基本框架
1.用手机浏览橙心优选小程序,通过FD代理拦截相应的浏览过的Json数据
2.再通过FiddlerScript把Json保存,并提交到后端
3.用Flask框架搭建一个后端api,然后将数据储存起来
开始实操:
先配置好FiddlerScrip中的OnBeforeResponse,也就是拦截响应前的数据,然后修改static function OnBeforeResponse(oSession: Session)这个函数
static function OnBeforeResponse(oSession: Session) {
if (m_Hide304s && oSession.responseCode == 304) {
oSession["ui-hide"] = "true";
}
//检测请求的url的是否满足条件
if (oSession.fullUrl.Contains("shop-gw.chengxinyouxuan.com/route/j/shopGoods?cityid=")){
oSession.utilDecodeResponse();//消除保存的请求可能存在乱码的情况
var jsonString = oSession.GetResponseBodyAsString();
var responseJSON = Fiddler.WebFormats.JSON.JsonDecode(jsonString);
if((responseJSON.JSONObject=='System.Collections.ArrayList' || responseJSON.JSONObject=='System.Collections.Hashtable')&&jsonString!='[]'&&jsonString!='{}'){
var str='{}';//构造自己的JSON http请求的信息及返回的结果
var data = Fiddler.WebFormats.JSON.JsonDecode(str);
data.JSONObject["request_method"] = oSession.RequestMethod;
var requestString = oSession.GetRequestBodyAsString();
data.JSONObject["request_body"]= requestString;
data.JSONObject["response_data"] = responseJSON.JSONObject;
data.JSONObject["url"] = oSession.fullUrl;
data.JSONObject["response_code"] = oSession.responseCode;
jsonString = Fiddler.WebFormats.JSON.JsonEncode(data.JSONObject)
var fso;
var file;
fso = new ActiveXObject("Scripting.FileSystemObject");
//保存数据txt文件到桌面
file = fso.OpenTextFile("C:\\Users\\Administrator\\Desktop\\Sessions.txt",8 ,true, true);
file.writeLine(jsonString);
file.writeLine("\n");
file.close();
// 数据通过GET请求发送自己的后台服务保存,这里大家可以自行修改
var method = "GET";
var myUrl = 'http://127.0.0.1:8000/spider';
//var url = myUrl+'?data='+Utilities.UrlEncode(jsonString);
var url = myUrl;
var protocol = "HTTP/1.1";
var raw="";
var selected: Session = oSession;
raw += method + " " + url + " " + protocol + "\r\n";
raw +="Host:localhost:8000\r\n";
raw +="Connection: keep-alive\r\n";
raw +="Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n";
raw +="User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36\r\n";
raw +="Accept-Encoding: gzip,deflate,sdch\r\n";
raw +="Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4\r\n";
raw +="Content-Type: application/json\r\n";
var body= "jsondata=''";
//var body= jsonString;
raw += "\r\n" + body;
FiddlerObject.utilIssueRequest(raw);
}
}
}
写好FDscrip之后记得保存哟!
保存之后,因为手动浏览过程当中,过多的图片会导致程序卡顿,所以这里我加了一步把图片过滤并拦截,这样手机就不显示图片,可以加快爬取的速度和效率。
然后接下来就是用python写Flask的后端程序
from flask import request
from flask import Flask
from flask import send_from_directory
import json
import csv
import os
app = Flask(__name__)
def save(datalist, filename):
"""
保存数据
"""
path = 'C:\\Users\\Administrator\\Desktop\\'
f = open (path + filename, encoding = 'utf-8', mode = 'w', newline='')
csv_writer = csv.writer(f)
csv_writer.writerow(['分类名', '标题', '原价', '现价', '销量', '截止时间', '预计发货时间'])
for data in datalist:
goods = data['data']
classname = goods['categoryName'] #分类名称
title = goods['name'] #标题
endtime = goods['endSellingTime'] #截至时间
senttime = goods['expectSendingTimeStr'] #预计发货时间
originalPrice = goods['originalPrice'] #原价
price = goods['price'] #现价
sold = goods['sold'] #销量
csv_data = [classname, title , originalPrice, price, sold, endtime, senttime]
print(csv_data)
csv_writer.writerow(csv_data)
f.close()
def changeformat():
"""
读取保存到桌面的json文件
"""
file_old = open(r'C:\Users\Administrator\Desktop\Sessions.txt', mode='r', encoding='utf-16-le')
text = file_old.read()
file_old.close()
os.remove(r'C:\Users\Administrator\Desktop\Sessions.txt')
return json.loads(text.encode('utf-8'))
@app.route("/spider", methods=['GET','POST'])
def spider():
"""
这里就是收到FD的请求之后,告诉python把拦截的json进行处理
"""
if request.method == 'GET':
try:
argsJson = changeformat() #读取Session.txt转换为json的字典对象
datalist = argsJson['response_data']['data']['result'][0]['goods']
save(datalist, '橙心优选.csv')
return {'msg':'OK'}
except Exception as e:
return {'msg':str(e)}
else:
return json.dumps({'msg': 'methods must POST'}, ensure_ascii=False)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=8000, debug=True)
写完Flask代码之后,我们直接运行代码
然后再配置好FD代理,用手机配置好证书等(这里我用的是IPhone 6s plus,因为抓HTTPS苹果系统必须IOS13以下,安卓7.0以下,这里大家可以寻找其他文章学习)。
最后就是打开某优选,点击分类,里面的分类只要刷一刷就可以把对应的信息都储存下来。
最后总结:
在一些特殊app,小程序当中,由于加密参数难以破解的情况下,为了少量获取数据可以采取的半自动化方式,通过浏览信息进行保存。
优点:万能,稳定
缺点:速度慢
但是最终主要学习到的内容是:用FD的高阶玩法编写拦截脚本
注明:本文为原创,未经允许不可以随意转载!并且文章仅提供思路和技巧学习,不得用于商业用途!