爬蟲實戰【9】Selenium解析淘寶寶貝-獲取寶貝信息並保存


通過昨天的分析,我們已經能到依次打開多個頁面了,接下來就是獲取每個頁面上寶貝的信息了。

分析頁面寶貝信息

【插入圖片,寶貝信息各項內容】

從圖片上看,每個寶貝有如下信息;price,title,url,deal amount,shop,location等6個信息,其中url表示寶貝的地址。

我們通過查看器分析,每個寶貝都在一個div里面,這個div的class屬性包含item。
而所有的item都在一個div內,這個總的div具有class屬性為items,也就是單個頁面上包含所有寶貝的一個框架。

因而,只有當這個div已經加載了,才能夠斷定頁面的寶貝信息是可以提取的,所以再提取信息之前,我們要判斷這個div的存在。

對於網頁源碼的解析,這次我們使用Pyquery,輪換着用一下嘛,感覺還是PyQuery比較好用,尤其是pyquery搜索到的對象還能在此進行搜索,很方便。
Pyquery的使用方法請查看我之前的文章,或者看一下API。
下面我們依次來分析一下每項信息應該如何提取。

1、Price
【插入圖片,price】

可以看出,price的信息在一個div里面,具有clas屬性price,我們如果通過text來獲取的話,還會將前面的人民幣符號得到,回頭切片切掉就好了。
2、Deal Amount
【插入圖片,amount】

成交量信息再一個class屬性為deal-cnt的div標簽里面,仍然需要將最后三個字符切掉。
3、Title
【插入圖片,title】

寶貝的標題在一個class屬性為title的div標簽里面,通過text可以獲取。
4、Shop

【插入圖片,shop和location】
店鋪名在一個class屬性為shop的div標簽呢。
5、Location
同上圖,class屬性為location。
6、URL
【插入圖片,寶貝的地址】

url地址在一個a標簽,class屬性為pic-link,這個a標簽的href屬性就是url地址。

from pyquery import PyQuery as pq
def get_products():
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.grid > div:nth-child(1)')))
    html=browser.page_source
    doc=pq(html)
    items=doc('div.item').items()#講解一下
    for item in items:
        product={
            'url':item('a.pic-link').attr('href'),
            'price':item.find('.price').text()[1:],
            'amount':item.find('.deal-cnt').text()[:-3],
            'title':item.find('.title').text(),
            'shop':item.find('.shop').text(),
            'location':item.find('.location').text()
        }
        print(product)
        #save_to_mongo(product)
        save_to_csv(product)

這里我們在講一下items的內容,看一下源碼中的范例:

> d = PyQuery('<div><span>foo</span><span>bar</span></div>')
> [i.text() for i in d.items('span')]
 ['foo', 'bar']
>[i.text() for i in d('span').items()]
 ['foo', 'bar']
>list(d.items('a')) == list(d('a').items())
 True

保存數據到MongoDb

如果我們獲取到product,想保存到MongoDb數據庫中,其實是很簡單的,設置好數據庫的url、數據庫名、表名,通過pymongo鏈接到對應的數據庫。
即使我們數據庫還未建立,沒關系的,會動態創建表格和數據。

import pymongo

'''MONGO設置'''
MONGO_URL='localhost'
MONGO_DB='taobao'
MONGO_Table=KEYWORD

client=pymongo.MongoClient(MONGO_URL)
db=client[MONGO_DB]

def save_to_mongo(product):
    try:
        if db[MONGO_Table].insert(product):
            print('保存成功',product)
    except Exception:
        print('保存出錯',product)
        pass

【插入圖片,MongoDB數據】

保存數據到CSV文件

其實也就是文本文件,只不過可以通過excel打開,方便我們做一些分析。
這里就不展開講了,請看代碼。

def save_to_csv(product):

    with open(FileName,'a') as f:
        s=product['title']+','+product['price']+','+product['amount']+','+product['location']+','+product['shop']+','+product['url']+'\n'
        try:
            f.write(s)
            print('保存到csv成功!',product)
        except:
            pass

全部代碼

只要改變KEYWORD關鍵字的內容,就能搜索到不同的寶貝信息,並保存下來,我們默認保存到csv文件中,數據畢竟只有幾千條,還是Excel方便。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from pyquery import PyQuery as pq
import re
import pymongo
from multiprocessing import Pool

'''要搜索的關鍵字'''
KEYWORD='Iphone8'
'''MONGO設置'''
MONGO_URL='localhost'
MONGO_DB='taobao'
MONGO_Table=KEYWORD
'''要保存的csv文件'''
FileName=KEYWORD+'.csv'
'''PhantomJS參數'''
SERVICE_ARGS=['--load-images=false']#不加載圖片,節省時間

client=pymongo.MongoClient(MONGO_URL)
db=client[MONGO_DB]

#browser=webdriver.Firefox()
browser=webdriver.PhantomJS(service_args=SERVICE_ARGS)
browser.set_window_size(1400,900)
index_url='https://www.taobao.com/'
wait=WebDriverWait(browser, 10)

def search(keyword):
    try:
        browser.get(index_url)
        #user_search_input=browser.find_element_by_css_selector('#q')
        #user_search_button=browser.find_element_by_css_selector('.btn-search')
        user_search_input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#q")))
        user_search_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".btn-search")))
        user_search_input.send_keys(keyword)
        user_search_button.click()
        total=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'div.total')))
        total_page=re.compile(r'(\d+)').search(total.text).group(1)
        print(total_page)
        get_products()
        return int(total_page)
    except TimeoutException:
        search(keyword)

def get_next_page(pageNum):
    try:
        user_page_input = wait.until(EC.presence_of_element_located((By.XPATH, "/html/body/div[1]/div[2]/div[3]/div[1]/div[26]/div/div/div/div[2]/input")))
        user_page_button = wait.until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[1]/div[2]/div[3]/div[1]/div[26]/div/div/div/div[2]/span[3]")))
        user_page_input.clear()
        user_page_input.send_keys(pageNum)
        user_page_button.click()
        wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'li.active > span:nth-child(1)'),str(pageNum)))
        get_products()
    except TimeoutException:
        get_next_page(pageNum)

def get_products():
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'.grid > div:nth-child(1)')))
    html=browser.page_source
    doc=pq(html)
    items=doc('div.item').items()
    for item in items:
        product={
            'url':item('a.pic-link').attr('href'),
            'price':item.find('.price').text()[1:],
            'amount':item.find('.deal-cnt').text()[:-3],
            'title':item.find('.title').text(),
            'shop':item.find('.shop').text(),
            'location':item.find('.location').text()
        }
        print(product)
        #save_to_mongo(product)
        save_to_csv(product)

def save_to_csv(product):

    with open(FileName,'a') as f:
        s=product['title']+','+product['price']+','+product['amount']+','+product['location']+','+product['shop']+','+product['url']+'\n'
        try:
            f.write(s)
            print('保存到csv成功!',product)
        except:
            pass

def save_to_mongo(product):
    try:
        if db[MONGO_Table].insert(product):
            print('保存成功',product)
    except Exception:
        print('保存出錯',product)
        pass


def main():
    total=search(KEYWORD)
    # p=Pool()
    # p.map(get_next_page,[i for i in range(2,total+1)])
    for i in range(2,total+1):
        get_next_page(i)
    browser.close()

if __name__=='__main__':
    main()

簡單分析一下結果

【插入圖片,結果分析示例】

月成交量最好的是一款老人機,只有79元。。。。
智能手機里面,vivo X20是賣的最好的,2999元價位。
1500價位,小米5x出現了。。。

這種類似的分析都是建立在數據挖掘的基礎上的,希望你能從本篇內容中學到一些知識。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM