硬抓取API

如果您导航到以下网址并选择Search By Country

然后插入AEfor Holder Country

如下:

按 后search。然后您会注意到XHR对以下API的调用,这是一个POST请求。

这是它:

正如你可以看到有qz,我不能得到它如何才能调用执行API,做分页太多。

有人可能知道如何调用该 API 并进行分页吗?

我达到最好的是JS的功能定位,其处理的参数编码这里

我已经使用代理轮换服务尝试了 selenium,但是在检索一些页面后我被检测到了。

回答

qz值使用“编码” JSONLZString.compressToBase64

qi值似乎最初是从qk源 HTML 中获取的,并0-附加在它前面。

var qk = "ooooooooooooooooooo";

// if(!(w == 790 && (h == 600 || h == 590))) 

qk = "yj0IAlhpQGl9BLWmmmJ2WMuzofkYFis64bmU5/6mE8w=";

某些请求要求在您提出请求后增加数字。

您还需要另一个答案中给出的 cookie。


回答

您需要生成一个wipo-visitor-uunidas 将它POST作为 cookie 以及一堆其他东西传递给请求。

生成的代码wipo-visitor-uunid是这样的:

(function (){
    //generate unique visitor id cookie
    if (!Math.imul) Math.imul = function(opA, opB) {
        opB |= 0; 
        var result = (opA & 0x003fffff) * opB;
        if (opA & 0xffc00000) result += (opA & 0xffc00000) * opB |0;
        return result |0;
      };
    
    var _cuunid = 'wipo-visitor-uunid=';
    uunid(0);

    function uunid(force){
        if (force || document.cookie.indexOf(_cuunid)===-1){
            var value = navigator.userAgent + Date.now() + Math.random().toString().substring(2,11);
            var cookie = _cuunid + cyrb53(value) + ';expires=Jan 2 2034 00:00:00; path=/; SameSite=Lax; domain=.wipo.int';
            document.cookie = cookie;    
        } 
    }
    function cyrb53(str, seed) {
        seed = seed || 0;
        let h1 = 0xdeadbeef ^ seed, h2 = 0x8badf00d ^ seed;
        for (let i = 0, ch; i < str.length; i++) {
            ch = str.charCodeAt(i);
            h1 = Math.imul(h1 ^ ch, 2654435761);
            h2 = Math.imul(h2 ^ ch, 1597334677);
        }
        h1 = Math.imul(h1 ^ h1>>>16, 2246822507) ^ Math.imul(h2 ^ h2>>>13, 3266489909);
        h2 = Math.imul(h2 ^ h2>>>16, 2246822507) ^ Math.imul(h1 ^ h1>>>13, 3266489909);
        // return 4294967296 * (2097151 & h2) + (h1>>>0);
        return (h2>>>0).toString(16)+(h1>>>0).toString(16);
    }
}());

wipo-visitor-uunid有效期至Jan 2 2034,所以一旦你拥有了它,你应该罚款。

哦,您添加到的字符串POST似乎是查询区域结果,但我不确定它是如何生成的。更多关于这个问题的其他答案。

这是代码,在你的最后测试它:

import json

import requests

query_string = "qz=N4IgLgngDgpiBcIBGAnAhgOwCYgDQgBs0EQYM8QBHASxIAYBaGAOSwAUAO"                "AMzAHY0AYgHcAWtQCuADQD2WNAQBeADyRIhCgIIBFLABlpANQIARAEIBNABIQ" 
               "AVlwCi0gKoBZALwVK4mN4QBGfAB9Ej8/Og46EABfIAAA="

with requests.Session() as s:
    the_cookies = s.get("https://www3.wipo.int/branddb/en/").cookies.get_dict()
    the_cookies["wipo-visitor-uunid"] = "994c22024f522fd"

    s.headers["user-agent"] = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
    s.headers["X-Requested-With"] = "XMLHttpRequest"
    s.headers["Referer"] = "https://www3.wipo.int/branddb/en/"

    end_point = f"https://www3.wipo.int/branddb/jsp/select.jsp?{query_string}"
    your_precious_data = s.post(end_point, cookies=the_cookies).json()
    print(json.dumps(your_precious_data, indent=2))

这应该返回如下所示的输出:

{
  "lastUpdated": 1616081900884,
  "sv": "www3.wipo.int",
  "response": {
    "docs": [
      {
        "OO": "NZ",
        "score": 1,
        "STATUS": "PEND",
        "MTY": [
          "Word"
        ],
        "AD": "2021-03-17T23:59:59Z",
        "HOL": [
          "PONSONBY DOGS LIMITED"
        ],
        "NC": [
          43
        ],
        "SOURCE": "NZTM",
        "DOC": "36/03/1173603_20210317.1919.xml.gz",
        "ID": "NZTM.1173603",
        "BRAND": [
          "Good Dog"
        ],
        "HOLC": [
          "NZ"
        ]
      },
and much, much more data ...


以上是硬抓取API的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>