Python的Flask+FiddlerScript某心优选万能爬虫法(可无视所有加密参数)

本期以某心优选小程序为例(仅供学习,不可作为商业用途!)


学习内容:

提示: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的高阶玩法编写拦截脚本

注明:本文为原创,未经允许不可以随意转载!并且文章仅提供思路和技巧学习,不得用于商业用途!

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

左手八嘎呀路

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

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

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

打赏作者

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

抵扣说明:

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

余额充值