淘寶天貓評論爬取,簡單的辦法完成滑動驗證

淘寶評論爬取 教你如果自動滑動驗證

一. 背景:

最近在準備一個關於文本情感分析的分享,首先想到使用淘寶的評論,由於淘寶以分類好好評差評,同時也打上了印象的標籤,比較適合與做情感分析的訓練樣本。
爬蟲的工具使用:selenium ,主要是由於其方便模擬點擊。當然如果有其他模擬工具都可以用,原理上是差不多的。

二.解決selenium登錄問題

由於selenium若新開窗口會出現cookie未保存的情況,導致每次進入再次登錄,這會造成一些不必要的麻煩.解決的辦法是讓selenium使用以開啓的瀏覽器爬去,此瀏覽器事先已經登錄了淘寶.具體的步驟如下:
1.命令行下開啓google-chrome,之後登錄淘寶以讓下一步的窗口繼承cookie

google-chrome  --remote-debugging-port=9222 --user-data-dir="."

2.設置selenium使用此google-chrome瀏覽器

    chrome_options = Options()
    chrome_options.add_experimental_option("debuggerAddress","127.0.0.1:9222")
    #免爬圖片
    #chrome_options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2}) 
    chrome_driver = "/usr/bin/chromedriver"
    driver = webdriver.Chrome(chrome_driver,chrome_options=chrome_options)

三.解決驗證碼問題

查詢的若較爲頻繁,就會收到如下圖這樣的驗證消息,我在解決這個驗證上花了一點時間,主要是對selenium對切換iframe上不了解,找尋滑塊上總是出現報錯

driver.find_element_by_xpath("//*[@id='nc_1_n1t']/span")

element not found nc_1_n1t

此驗證窗口爲一個新的iframe,
在這裏插入圖片描述
需要先進入iframe找到滑塊,完成點擊,另外需要注意部分有的時候淘寶檢測到爲爬蟲即使划過去了也會報錯如下.所以可能需要多次驗證.
在這裏插入圖片描述

具體代碼如下:

#處理驗證碼
def handle_vertify(driver):
    iframe = driver.find_elements_by_xpath('//div[@class="sufei-dialog-content"]//iframe')
    #iframe = driver.find_elements_by_xpath('//div[@class="sufei-tb-dialog-content sufei-tb-overlay-content"]//iframe') 
    print(iframe)
    if len(iframe) == 0:
        return
    driver.switch_to_frame(iframe[0])
    trys = 0
    #需要多次嘗試
    while trys < 5:
        trys += 1
        slider=driver.find_element_by_xpath("//*[@id='nc_1_n1t']/span")#需要滑動的元素
        ActionChains(driver).click_and_hold(slider).perform()
        #大概滑動300就可以通過驗證
        trace = [10,20,30,40,40,40,30,30,30,30]
        for i in range(len(trace)):
            ActionChains(driver).move_by_offset(xoffset=trace[i],yoffset=0).perform()
        ActionChains(driver).release().perform()
        #move_to_gap2(driver,slider,get_track(270))
        refresh = driver.find_elements_by_xpath("//span[@class='nc-lang-cnt']/a")
        if len(refresh) > 0:
            refresh[0].click()
            continue
        time.sleep(random.randint(2,5))
        if driver.page_source.find("nc_1_n1t") == -1:
            driver.switch_to.parent_frame()
            break
    if trys >= 5:
        print("[Error]:vertify code error")
    else:
        print("[Success]:vertify code error")

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章