水平有限,仅供参考。
如图所示,汽车之家的车辆详情里的数据做了反爬对策,数据被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,还在学习中,找不到更好的解法。