硬刮 API

Posted

技术标签:

【中文标题】硬刮 API【英文标题】:Hard Scraping API 【发布时间】:2021-06-16 05:43:08 【问题描述】:

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

然后为Holder Country 插入AE

如下:

按下search 后。然后你会注意到一个XHR 调用下面的API 这是一个POST 请求。

这里是:

如您所见,qz,我不知道它是如何实现的,以便调用 API 并进行分页。

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

我达到的最好的是处理参数编码here的JS函数位置

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

【问题讨论】:

【参考方案1】:

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

生成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 ...

【讨论】:

感谢您提供的答案。 qz 值实际上是一个动态值,它在分页期间发生了变化,甚至它应该验证到您正在寻找的国家/地区的API。由其他声音。如何为AE 分页API? 仅供读者阅读。此答案只是对 API 的全局调用,其中无法按问题中所述按国家/地区控制 filter,甚至无法解决 pagination 方法。【参考方案2】:

qz 值是 “编码” JSON 使用 LZString.compressToBase64

qi 值似乎最初取自源 HTML 中的 qk,并在其前面加上 0-

var qk = "ooooooooooooooooooo";

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

qk = "yj0IAlhpQGl9BLWmmmJ2WMuzofkYFis64bmU5/6mE8w=";

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

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

【讨论】:

你是一个真正的传奇人物,这个答案值得一万亿谢谢 :) 谢谢,你今天学到了一些很棒的东西。 请问qk如何从"ooooooooooooooooooo"变为"yj0IAlhpQGl9BLWmmmJ2WMuzofkYFis64bmU5/6mE8w="?我想这也是 ahmed 的问题? @QHarr 它位于www3.wipo.int/branddb/en 的源代码中 - 不知道他们为什么用虚拟值初始化它 - 但“真实”值会在 2 行后设置。 Referrer 标头错误,Accept 标头丢失。虽然这不是“公共 API” - 他们明确声明不允许网络抓取 wipo.int/reference/en/branddb/terms_and_conditions.html - 所以你尝试的事情是不可能的。

以上是关于硬刮 API的主要内容,如果未能解决你的问题,请参考以下文章

免费手机号码归属地API查询接口

大数据学习2019.03.20

restful

restful

js中数组操作

APIRESTRESTFUL