真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python爬蟲中使用Selenium抓取淘寶商品的案例分析-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比未央網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式未央網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋未央地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。

這篇文章主要介紹Python爬蟲中使用Selenium抓取淘寶商品的案例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

在前一章中,我們已經(jīng)成功嘗試分析Ajax來抓取相關(guān)數(shù)據(jù),但是并不是所有頁面都可以通過分析Ajax來完成抓取。比如,淘寶,它的整個(gè)頁面數(shù)據(jù)確實(shí)也是通過Ajax獲取的,但是這些Ajax接口參數(shù)比較復(fù)雜,可能會包含加密密鑰等,所以如果想自己構(gòu)造Ajax參數(shù),還是比較困難的。對于這種頁面,最方便快捷的抓取方法就是通過Selenium。本節(jié)中,我們就用Selenium來模擬瀏覽器操作,抓取淘寶的商品信息,并將結(jié)果保存到MongoDB。

1. 本節(jié)目標(biāo)

本節(jié)中,我們要利用Selenium抓取淘寶商品并用pyquery解析得到商品的圖片、名稱、價(jià)格、購買人數(shù)、店鋪名稱和店鋪所在地信息,并將其保存到MongoDB。

2. 準(zhǔn)備工作

本節(jié)中,我們首先以Chrome為例來講解Selenium的用法。在開始之前,請確保已經(jīng)正確安裝好Chrome瀏覽器并配置好了ChromeDriver;另外,還需要正確安裝Python的Selenium庫;最后,還對接了PhantomJS和Firefox,請確保安裝好PhantomJS和Firefox并配置好了GeckoDriver。如果環(huán)境沒有配置好,可參考第1章。

3. 接口分析

首先,我們來看下淘寶的接口,看看它比一般Ajax多了怎樣的內(nèi)容。

打開淘寶頁面,搜索商品,比如iPad,此時(shí)打開開發(fā)者工具,截獲Ajax請求,我們可以發(fā)現(xiàn)獲取商品列表的接口,如圖7-19所示。

Python爬蟲中使用Selenium抓取淘寶商品的案例分析

它的鏈接包含了幾個(gè)GET參數(shù),如果要想構(gòu)造Ajax鏈接,直接請求再好不過了,它的返回內(nèi)容是JSON格式,如圖7-20所示。

Python爬蟲中使用Selenium抓取淘寶商品的案例分析

但是這個(gè)Ajax接口包含幾個(gè)參數(shù),其中_ksTS、rn參數(shù)不能直接發(fā)現(xiàn)其規(guī)律,如果要去探尋它的生成規(guī)律,也不是做不到,但這樣相對會比較煩瑣,所以如果直接用Selenium來模擬瀏覽器的話,就不需要再關(guān)注這些接口參數(shù)了,只要在瀏覽器里面可以看到的,都可以爬取。這也是我們選用Selenium爬取淘寶的原因。

4. 頁面分析

本節(jié)的目標(biāo)是爬取商品信息。圖7-21是一個(gè)商品條目,其中包含商品的基本信息,包括商品圖片、名稱、價(jià)格、購買人數(shù)、店鋪名稱和店鋪所在地,我們要做的就是將這些信息都抓取下來。

Python爬蟲中使用Selenium抓取淘寶商品的案例分析

抓取入口就是淘寶的搜索頁面,這個(gè)鏈接可以通過直接構(gòu)造參數(shù)訪問。例如,如果搜索iPad,就可以直接訪問https://s.taobao.com/search?q=iPad,呈現(xiàn)的就是第一頁的搜索結(jié)果,如圖7-22所示。

Python爬蟲中使用Selenium抓取淘寶商品的案例分析

在頁面下方,有一個(gè)分頁導(dǎo)航,其中既包括前5頁的鏈接,也包括下一頁的鏈接,同時(shí)還有一個(gè)輸入任意頁碼跳轉(zhuǎn)的鏈接,如圖7-23所示。

Python爬蟲中使用Selenium抓取淘寶商品的案例分析

這里商品的搜索結(jié)果一般大都為100頁,要獲取每一頁的內(nèi)容,只需要將頁碼從1到100順序遍歷即可,頁碼數(shù)是確定的。所以,直接在頁面跳轉(zhuǎn)文本框中輸入要跳轉(zhuǎn)的頁碼,然后點(diǎn)擊“確定”按鈕即可跳轉(zhuǎn)到頁碼對應(yīng)的頁面。

這里不直接點(diǎn)擊“下一頁”的原因是:一旦爬取過程中出現(xiàn)異常退出,比如到50頁退出了,此時(shí)點(diǎn)擊“下一頁”時(shí),就無法快速切換到對應(yīng)的后續(xù)頁面了。此外,在爬取過程中,也需要記錄當(dāng)前的頁碼數(shù),而且一旦點(diǎn)擊“下一頁”之后頁面加載失敗,還需要做異常檢測,檢測當(dāng)前頁面是加載到了第幾頁。整個(gè)流程相對比較復(fù)雜,所以這里我們直接用跳轉(zhuǎn)的方式來爬取頁面。

當(dāng)我們成功加載出某一頁商品列表時(shí),利用Selenium即可獲取頁面源代碼,然后再用相應(yīng)的解析庫解析即可。這里我們選用pyquery進(jìn)行解析。下面我們用代碼來實(shí)現(xiàn)整個(gè)抓取過程。

5. 獲取商品列表

首先,需要構(gòu)造一個(gè)抓取的URL:https://s.taobao.com/search?q=iPad。這個(gè)URL非常簡潔,參數(shù)q就是要搜索的關(guān)鍵字。只要改變這個(gè)參數(shù),即可獲取不同商品的列表。這里我們將商品的關(guān)鍵字定義成一個(gè)變量,然后構(gòu)造出這樣的一個(gè)URL。

然后,就需要用Selenium進(jìn)行抓取了。我們實(shí)現(xiàn)如下抓取列表頁的方法:

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from urllib.parse import quote
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 10)
KEYWORD = 'iPad'
def index_page(page):
    """
    抓取索引頁
    :param page: 頁碼
    """
    print('正在爬取第', page, '頁')
    try:
        url = 'https://s.taobao.com/search?q=' + quote(KEYWORD)
        browser.get(url)
        if page > 1:
            input = wait.until(
                EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager div.form > input')))
            submit = wait.until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager div.form > span.btn.J_Submit')))
            input.clear()
            input.send_keys(page)
            submit.click()
        wait.until(
            EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager li.item.active > span'), 
            str(page)))
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.m-itemlist .items .item')))
        get_products()
    except TimeoutException:
        index_page(page)

這里首先構(gòu)造了一個(gè)WebDriver對象,使用的瀏覽器是Chrome,然后指定一個(gè)關(guān)鍵詞,如iPad,接著定義了index_page()方法,用于抓取商品列表頁。

在該方法里,我們首先訪問了搜索商品的鏈接,然后判斷了當(dāng)前的頁碼,如果大于1,就進(jìn)行跳頁操作,否則等待頁面加載完成。

等待加載時(shí),我們使用了WebDriverWait對象,它可以指定等待條件,同時(shí)指定一個(gè)最長等待時(shí)間,這里指定為最長10秒。如果在這個(gè)時(shí)間內(nèi)成功匹配了等待條件,也就是說頁面元素成功加載出來了,就立即返回相應(yīng)結(jié)果并繼續(xù)向下執(zhí)行,否則到了大等待時(shí)間還沒有加載出來時(shí),就直接拋出超時(shí)異常。

比如,我們最終要等待商品信息加載出來,就指定了presence_of_element_located這個(gè)條件,然后傳入了.m-itemlist .items .item這個(gè)選擇器,而這個(gè)選擇器對應(yīng)的頁面內(nèi)容就是每個(gè)商品的信息塊,可以到網(wǎng)頁里面查看一下。如果加載成功,就會執(zhí)行后續(xù)的get_products()方法,提取商品信息。

關(guān)于翻頁操作,這里首先獲取頁碼輸入框,賦值為input,然后獲取“確定”按鈕,賦值為submit,分別是圖7-24中的兩個(gè)元素。

Python爬蟲中使用Selenium抓取淘寶商品的案例分析

首先,我們清空了輸入框,此時(shí)調(diào)用clear()方法即可。隨后,調(diào)用send_keys()方法將頁碼填充到輸入框中,然后點(diǎn)擊“確定”按鈕即可。

那么,怎樣知道有沒有跳轉(zhuǎn)到對應(yīng)的頁碼呢?我們可以注意到,成功跳轉(zhuǎn)某一頁后,頁碼都會高亮顯示,如圖7-25所示。

Python爬蟲中使用Selenium抓取淘寶商品的案例分析

我們只需要判斷當(dāng)前高亮的頁碼數(shù)是當(dāng)前的頁碼數(shù)即可,所以這里使用了另一個(gè)等待條件text_to_be_present_in_element,它會等待指定的文本出現(xiàn)在某一個(gè)節(jié)點(diǎn)里面時(shí)即返回成功。這里我們將高亮的頁碼節(jié)點(diǎn)對應(yīng)的CSS選擇器和當(dāng)前要跳轉(zhuǎn)的頁碼通過參數(shù)傳遞給這個(gè)等待條件,這樣它就會檢測當(dāng)前高亮的頁碼節(jié)點(diǎn)是不是我們傳過來的頁碼數(shù),如果是,就證明頁面成功跳轉(zhuǎn)到了這一頁,頁面跳轉(zhuǎn)成功。

這樣剛才實(shí)現(xiàn)的index_page()方法就可以傳入對應(yīng)的頁碼,待加載出對應(yīng)頁碼的商品列表后,再去調(diào)用get_products()方法進(jìn)行頁面解析。

6. 解析商品列表

接下來,我們就可以實(shí)現(xiàn)get_products()方法來解析商品列表了。這里我們直接獲取頁面源代碼,然后用pyquery進(jìn)行解析,實(shí)現(xiàn)如下:

from pyquery import PyQuery as pq
def get_products():
    """
    提取商品數(shù)據(jù)
    """
    html = browser.page_source
    doc = pq(html)
    items = doc('#mainsrp-itemlist .items .item').items()
    for item in items:
        product = {
            'image': item.find('.pic .img').attr('data-src'),
            'price': item.find('.price').text(),
            'deal': item.find('.deal-cnt').text(),
            'title': item.find('.title').text(),
            'shop': item.find('.shop').text(),
            'location': item.find('.location').text()
        }
        print(product)
        save_to_mongo(product)

首先,調(diào)用page_source屬性獲取頁碼的源代碼,然后構(gòu)造了PyQuery解析對象,接著提取了商品列表,此時(shí)使用的CSS選擇器是#mainsrp-itemlist .items .item,它會匹配整個(gè)頁面的每個(gè)商品。它的匹配結(jié)果是多個(gè),所以這里我們又對它進(jìn)行了一次遍歷,用for循環(huán)將每個(gè)結(jié)果分別進(jìn)行解析,每次循環(huán)把它賦值為item變量,每個(gè)item變量都是一個(gè)PyQuery對象,然后再調(diào)用它的find()方法,傳入CSS選擇器,就可以獲取單個(gè)商品的特定內(nèi)容了。

比如,查看一下商品信息的源碼,如圖7-26所示。

Python爬蟲中使用Selenium抓取淘寶商品的案例分析

可以發(fā)現(xiàn),它是一個(gè)img節(jié)點(diǎn),包含id、class、data-src、alt和src等屬性。這里之所以可以看到這張圖片,是因?yàn)樗膕rc屬性被賦值為圖片的URL。把它的src屬性提取出來,就可以獲取商品的圖片了。不過我們還注意data-src屬性,它的內(nèi)容也是圖片的URL,觀察后發(fā)現(xiàn)此URL是圖片的完整大圖,而src是壓縮后的小圖,所以這里抓取data-src屬性來作為商品的圖片。

因此,我們需要先利用find()方法找到圖片的這個(gè)節(jié)點(diǎn),然后再調(diào)用attr()方法獲取商品的data-src屬性,這樣就成功提取了商品圖片鏈接。然后用同樣的方法提取商品的價(jià)格、成交量、名稱、店鋪和店鋪所在地等信息,接著將所有提取結(jié)果賦值為一個(gè)字典product,隨后調(diào)用save_to_mongo()將其保存到MongoDB即可。

7. 保存到MongoDB

接下來,我們將商品信息保存到MongoDB,實(shí)現(xiàn)代碼如下:

MONGO_URL = 'localhost'
MONGO_DB = 'taobao'
MONGO_COLLECTION = 'products'
client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]
def save_to_mongo(result):
    """
    保存至MongoDB
    :param result: 結(jié)果
    """
    try:
        if db[MONGO_COLLECTION].insert(result):
            print('存儲到MongoDB成功')
    except Exception:
        print('存儲到MongoDB失敗')

這里首先創(chuàng)建了一個(gè)MongoDB的連接對象,然后指定了數(shù)據(jù)庫,隨后指定了Collection的名稱,接著直接調(diào)用insert()方法將數(shù)據(jù)插入到MongoDB。此處的result變量就是在get_products()方法里傳來的product,包含單個(gè)商品的信息。

8. 遍歷每頁

剛才我們所定義的get_index()方法需要接收參數(shù)page,page代表頁碼。這里我們實(shí)現(xiàn)頁碼遍歷即可,代碼如下:

MAX_PAGE = 100
def main():
    """
    遍歷每一頁
    """
    for i in range(1, MAX_PAGE + 1):
        index_page(i)

其實(shí)現(xiàn)非常簡單,只需要調(diào)用一個(gè)for循環(huán)即可。這里定義大的頁碼數(shù)為100,range()方法的返回結(jié)果就是1到100的列表,順序遍歷,調(diào)用index_page()方法即可。

這樣我們的淘寶商品爬蟲就完成了,最后調(diào)用main()方法即可運(yùn)行。

9. 運(yùn)行

運(yùn)行代碼,可以發(fā)現(xiàn)首先會彈出一個(gè)Chrome瀏覽器,然后會訪問淘寶頁面,接著控制臺便會輸出相應(yīng)的提取結(jié)果,如圖7-27所示。

Python爬蟲中使用Selenium抓取淘寶商品的案例分析

可以發(fā)現(xiàn),這些商品信息的結(jié)果都是字典形式,它們被存儲到MongoDB里面。

再看一下MongoDB中的結(jié)果,如圖7-28所示。

Python爬蟲中使用Selenium抓取淘寶商品的案例分析

可以看到,所有的信息都保存到MongoDB里了,這說明爬取成功。

10. Chrome Headless模式

從Chrome 59版本開始,已經(jīng)開始支持Headless模式,也就是無界面模式,這樣爬取的時(shí)候就不會彈出瀏覽器了。如果要使用此模式,請把Chrome升級到59版本及以上。啟用Headless模式的方式如下:

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=chrome_options)

首先,創(chuàng)建ChromeOptions對象,接著添加headless參數(shù),然后在初始化Chrome對象的時(shí)候通過chrome_options傳遞這個(gè)ChromeOptions對象,這樣我們就可以成功啟用Chrome的Headless模式了。

11. 對接Firefox

要對接Firefox瀏覽器,非常簡單,只需要更改一處即可:

browser = webdriver.Firefox()

這里更改了browser對象的創(chuàng)建方式,這樣爬取的時(shí)候就會使用Firefox瀏覽器了。

12. 對接PhantomJS

如果不想使用Chrome的Headless模式,還可以使用PhantomJS(它是一個(gè)無界面瀏覽器)來抓取。抓取時(shí),同樣不會彈出窗口,還是只需要將WebDriver的聲明修改一下即可:

browser = webdriver.PhantomJS()

另外,它還支持命令行配置。比如,可以設(shè)置緩存和禁用圖片加載的功能,進(jìn)一步提高爬取效率:

SERVICE_ARGS = ['--load-images=false', '--disk-cache=true']
browser = webdriver.PhantomJS(service_args=SERVICE_ARGS)

以上是Python爬蟲中使用Selenium抓取淘寶商品的案例分析的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!


名稱欄目:Python爬蟲中使用Selenium抓取淘寶商品的案例分析-創(chuàng)新互聯(lián)
URL地址:http://weahome.cn/article/cocjos.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部