水平有限,僅供參考。
如圖所示,汽車之家的車輛詳情里的數據做了反爬對策,數據被CSS偽類替換。
觀察 Sources 發現數據就在當前頁面。
發現若干條進行CSS替換的js
繼續深入此JS
知道了數據與規則,剩下的交給PYTHON。
def repliceStr(browser,textJs,Js):
_config_pos=textJs.find("return '.")
JsSplit=textJs[_config_pos:_config_pos+70]
ClassHead=re.search("[A-Za-z]{2}_[A-Za-z]{2}",JsSplit,re.S).group(0)
ClassFoot=re.search("_[A-Za-z]+';",JsSplit,re.S).group(0)[:-2]
pos=textJs.find("$InsertRule$($index$, $temp$);")
top=textJs[0:pos]
bottom=textJs[pos:]
JsBack = browser.execute_script('''
var suc={};
'''+top+' suc[$index$]=$temp$; '+bottom+'''
return suc
''')
for cj in range(0,len(JsBack)):
cjclass=ClassHead+str(cj)+ClassFoot
Js=re.sub("<span class='"+cjclass+"'></span>",JsBack[str(cj)], Js)
return Js
#獲取詳情頁的數據
def getDetail(base_url):
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.get(base_url)
#在這里進行文件替換,反爬頁面
#keyLink = re.search("var keyLink = (.*?)}];", browser.page_source, re.S)
config = re.search("var config = (.*?)};", browser.page_source, re.S)
option = re.search("var option = (.*?)};", browser.page_source, re.S)
option=option.group(0)[13:-1]
config=config.group(0)[13:-1]
script = re.findall("<script>(.*?)</script>", browser.page_source,re.S)
for i in range(0,len(script)):
if re.search("_config",script[i],re.S) :
config=repliceStr(browser,script[i],config)
if re.search("_option",script[i],re.S) :
option=repliceStr(browser,script[i],option)
option=demjson.decode(option);
config=demjson.decode(config);
carr={}
for item in config['result']['paramtypeitems'] :
bigTitle=item['name']
carr[bigTitle]={}
index=0
for ni in item['paramitems']:
cate =ni['name']
value=ni['valueitems'][0]['value']
carr[bigTitle][index]=[cate,value]
index=index+1
for item in option['result']['configtypeitems'] :
bigTitle=item['name']
carr[bigTitle]={}
index=0
for ni in item['configitems']:
cate =ni['name']
value=ni['valueitems'][0]['value']
carr[bigTitle][index]=[cate,value]
index=index+1
time.sleep(10)
return carr
剛接觸PYTHON,還在學習中,找不到更好的解法。
好像有比selenium更好用的工具了 推薦 python+pyppeteer+chrome