前些阵子在抓某平台的数据时,每个接口都带有加密的sign参数,于是决定调试js代码,但无奈js代码实在太多,直接把控制台卡死,基本上没法打断点调试,于是决定上大杀器webdriver。
一般我们用webdriver时候都是通过xpath,css之类的选择器取页面的数据,今天我教你另一种方案,直接获得response!
此方法能够应对任意的需要签名,带加密参数的反爬手段,所见即所得。
import
重点就是 这几个设置,我上面的建议都加上:
options.add_experimental_option('perfLoggingPrefs', {'enableNetwork': True})
caps['goog:loggingPrefs'] = {'performance': 'ALL'}
看名字也能知道是和log有关的;log里面记录了每一个http请求的id,通过id,就可以直接获得response了。
def get_body(self, log, driver):
#获得log里面的requestid,通过id来获得response的内容
requestId = json.loads(log.get("message")).get("message").get("params").get("requestId")
#
driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': requestId})
response_dict = driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': requestId})
#注意,这里获得的body是字符串形式,需要序列化为json对象/
body = response_dict["body"]
Jres = json.loads(body)
return Jres
driver.get(url="目标url")
#chrome的日志将开启并记录所有的访问。
try:
logs = driver.get_log("performance")
for log in logs[:]:
try:
url = json.loads(log.get("message")).get("message").get("params").get("request").get("url")
except:
url = None
if url:
# 111 左上角个人档案信息 ->,这里是我要获取的内容的url正则,你根据你自己要获取的接口编写。
# 正则表达是匹配 需要抓取的那一个请求
regex_person_document = re.compile(
'https://star.toutiao.com/v/api/user/author_page/?author_id=(d+)&recommend=false&platform_source=1'
)
if regex_person_document.findall(url):
# 获得了 json形式的响应体,就能按需要获得里面的数据了
Jres = self.get_body(log, driver)
except:
pass