python 爬虫 汽车之家车辆参数反爬

水平有限,仅供参考。


如图所示,汽车之家的车辆详情里的数据做了反爬对策,数据被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

posted on 2020-12-03 09:37  suchen07  阅读(700)  评论(2编辑  收藏  举报