python 爬蟲 selenium 2019淘寶商品信息爬取

淘寶自19年6月份就開啓了登錄驗證,這增加了爬蟲難度,所以先嚐試用穩妥的方法selenium來爬取,首先要確定爬取流程,打開淘寶官網www.taobao.com,

輸入搜索內容,會發現跳轉到一個登錄界面

所以要先登錄,這個地方我就設置了等待,等待登錄成功後的搜索框元素出現再執行下面的操作,

目標是爬取每個商品的名稱,價格,銷量,以及店鋪的名稱和位置,所以找他們相應的元素地址,我這裏是用xpath,可以發現規律,x部分爲商品的序號

//*[@id="mainsrp-itemlist"]/div/div/div[1]/div['+str(x)+']/div[2]/div[1]/div[1]/strong

而商品的名字目前用的是通過找到相對應的classname,

goods_name=driver.find_elements_by_class_name('J_ClickStat')

列表裏單數的text爲商品名字。

這樣大概就完成了整個爬取過程,然後就是要爬多少的問題了,我這裏就爬了三頁,因爲商品有時候出現的多有時候少,每一頁會不一樣,我就爬最多的48個,然後增加try防止異常中止。另外都要加上time.sleep(),這樣才爬取的比較穩定,但是速度會偏慢,不過都用selenium了,就註定是要犧牲效率的,代碼如下:

# coding=gbk
import time

import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://www.taobao.com/")
driver.maximize_window()
driver.find_element_by_xpath('/html/body/div[4]/div[2]/div[1]/div/div[2]/div[1]/a[1]').click() #點擊登錄
time.sleep(3)
windows = driver.window_handles #獲取窗口數
driver.switch_to.window(windows[-1]) #切換最新窗口
time.sleep(3)
'''掃碼登錄,需要自己登錄賬號,淘寶自19年6月開啓登錄驗證限制'''
input_str=WebDriverWait(driver,10).until(EC.presence_of_element_located((By.XPATH,'//*[@id="q"]'))) #等待輸入框出現
input_str.send_keys('皇馬球衣') #輸入搜索內容
driver.find_element_by_xpath('//*[@id="J_TSearchForm"]/div[1]/button').click() #點擊搜索按鈕
driver.implicitly_wait(30)
all_list=[]
for x in range(3):
    next_page = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > ul > li.item.next > a')))  # 等待確定跳轉出現
    goods_name=driver.find_elements_by_class_name('J_ClickStat') #商品名字
    counter=1
    goods_list=[]
    for x in range(1,48):
        try:
            goods_dict={}
            goods_dict['商品名字'] = goods_name[counter].text  # 商品名字
            goods_dict['商品價格']=float(driver.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div['+str(x)+']/div[2]/div[1]/div[1]/strong').text) #商品價格
            goods_dict['銷量'] = driver.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div[' + str(x) + ']/div[2]/div[1]/div[2]').text[:-3]  # 商品銷售量
            goods_dict['店鋪名字']=driver.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div['+str(x)+']/div[2]/div[3]/div[1]/a/span[2]').text #店鋪名字
            goods_dict['店鋪位置']=driver.find_element_by_xpath('//*[@id="mainsrp-itemlist"]/div/div/div[1]/div['+str(x)+']/div[2]/div[3]/div[2]').text #店鋪位置
            counter+=2
            goods_list.append(goods_dict)
            time.sleep(2)
        except:
            print('部分爬取失敗',Exception)
    all_list+=goods_list
    print(len(all_list))
    try:
        target = driver.find_element_by_css_selector("#mainsrp-pager > div > div > div > ul > li.item.next > a")
        driver.execute_script("arguments[0].scrollIntoView();", target)  # 拖動到可見的元素去
        target.click()
    except:
        print('部分爬取失敗',Exception)
    driver.implicitly_wait(30)
    time.sleep(2)
all_list.sort(key=lambda k: (k.get('商品價格', 0)),reverse=True)
for x in all_list[:100]:
    print(x,end='\n')
p_columns=['商品名字','商品價格','銷量','店鋪名字','店鋪位置']
raw_list = pd.DataFrame(columns=p_columns,data=all_list)#把嵌套列表轉化爲DataFrame對象
raw_list.to_csv('goodsinfo.csv', encoding='gbk')#存儲爲csv文件

以上代碼僅供學習研究使用,切勿用作他用,所造成的後果請自行負責,另外我用的是Chrome瀏覽器,selenium webdriver需要裝相對於的瀏覽器插件,這方面知識請自行搜索

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