硬刮 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的主要内容,如果未能解决你的问题,请参考以下文章