收到 Issues , 库中的代码不能使用了,看起来是接口的协议更新后使用了protobuf。

万方protobuf协议请求案例_爬虫


控制台抓包, 看起来比较符合的接口 https://s.wanfangdata.com.cn/SearchService.SearchService/search?

习惯性通过 Initiator 进入断点。
万方protobuf协议请求案例_爬虫_02
刷新页面

万方protobuf协议请求案例_爬虫_03
查看各部分参数。
万方protobuf协议请求案例_爬虫_04
控制台上打印一下 ,这个就是请求参数。
万方protobuf协议请求案例_爬虫_05
再继续找。
万方protobuf协议请求案例_爬虫_06
这里的e是返回的数据。
万方protobuf协议请求案例_爬虫_07
万方protobuf协议请求案例_爬虫_08

找到请求信息和返回信息后,可以按照对应格式构建一个protobuf文件。

protobuf消息传输协议在app逆向时经常遇到,就不多具体介绍了。


已知请求参数

params = {
    'searchtype': "paper",
    'searchWord': 'lxlx',
    'currentPage': '1',
    'pageSize': '20',
    'searchFilter': [0],
    'searchScope': '0',
    'searchSort': 'null',
}

那么pro文件:

syntax = "proto3";

message SearchService {

    message CommonRequest {
        string searchType = 1;
        string searchWord = 2;
        int32 currentPage = 3;
        int32 pageSize = 4;
        SearchScope searchScope = 5;
        repeated SearchFilter searchFilter = 6;
    }

    message SearchRequest {
        CommonRequest commonrequest = 1;
    }
}

然后用protoc 编译成py文件。

 .\protoc.exe --python_out=. ./s.proto

万方protobuf协议请求案例_爬虫_09

编译后的文件时 s_pb2.py

调用下看看

import s_pb2 as pb
search_request = pb.SearchService.SearchRequest()
search_request.commonrequest.searchType = "paper"
search_request.commonrequest.searchWord = 'lxlx'
search_request.commonrequest.searchScope = 0
search_request.commonrequest.currentPage = 1
search_request.commonrequest.pageSize = 20
search_request.commonrequest.searchFilter.append(0)

bytes_body = search_request.SerializeToString()
print(bytes_body)

输出:
万方protobuf协议请求案例_爬虫_10
和浏览器的参数基本一致,
万方protobuf协议请求案例_爬虫_11

下面可以用代码测试请求,经过测试可以成功返回数据。
万方protobuf协议请求案例_爬虫_12


关于如何解析返回的protobuf数据:
万方protobuf协议请求案例_爬虫_13

逻辑是一样的,按照上面js拦截到的返回格式,构建一个pro文件,然后编译成py文件调用。
返回的内容很多,太麻烦,就不再写了。