1. 程式人生 > >python 使用selenium+urllib爬取淘寶MM照片

python 使用selenium+urllib爬取淘寶MM照片

        本文介紹瞭如何爬取淘寶模特列表頁的模特相簿圖片。由於相簿的照片是動態生成的所以用到了selenium和chromedriver來載入頁面。

        爬取圖片的思路如下:

       1.從起始頁開始先獲取模特個人資訊頁連結;

       2.從個人資訊頁獲取相簿主頁連結;

       3.從相簿主頁獲取各個相簿的連結;

       4.從相簿的連結獲取每張照片的地址,再下載照片。

      流程如下圖所示:


準備工具:

    1.安裝selenium:pip install selenium;     2.安裝chrome瀏覽器     3.下載chromedriver.exe,把chromedriver.exe新增到環境變數中,為了省事我放到了C:\Python27\Scripts目錄下,如下圖所示;                                                            

一.獲取模特個人資訊連結

檢查元素,找到個人資訊連結的位置,然後用webdriverObj.find_elements_by_xpath('//p[@class="top"]/a[@class="lady-name"]')提取。


程式碼如下:

def get_model_info_links(webdriverObj, model_list_page_link):
    '''
    從https://mm.taobao.com/json/request_top_list.htm?page=XXX獲取模特個人資訊頁連結
    '''
webdriverObj.get(model_list_page_link)
    time.sleep(1
) model_info_links = [] info_link_elems = webdriverObj.find_elements_by_xpath('//p[@class="top"]/a[@class="lady-name"]') for x in info_link_elems: info_link = x.get_attribute('href') model_info_links.append(info_link) return model_info_links

二.從個人資訊頁獲取相簿主頁連結

檢查元素,找出相簿主頁的連結的位置,用webdriverObj.find_elements_by_xpath('/html/body/div[4]/div[1]/ul/li[1]/span/a')提取,可以使用瀏覽器自帶的“copy xpath”功能拷貝相簿的xpath地址:


程式碼如下:

def get_model_album_home_links(webdriverObj, model_info_link):
    webdriverObj.get(model_info_link)
    time.sleep(1)
    album_home_links = []
    link_elems = webdriverObj.find_elements_by_xpath('/html/body/div[4]/div[1]/ul/li[1]/span/a')
    for x in link_elems:
        link = x.get_attribute('href')
        album_home_links.append(link)

    return album_home_links

三.從相簿主頁獲取各個相簿的連結

檢查元素,找到相簿的連結的位置,用webdriverObj.find_elements_by_xpath('//div[@class="mm-photo-list clearfix"]/div/div/h4/a')提取。


程式碼如下:

def get_model_album_links(webdriverObj, album_home_link):
    webdriverObj.get(album_home_link)
    aElements = webdriverObj.find_elements_by_xpath('//div[@class="mm-photo-list clearfix"]/div/div/h4/a')
    albumLinks = []
    for x in aElements:
        link = x.get_attribute('href')
        albumLinks.append(link)
    return albumLinks

四.從相簿的連結獲取每張照片的地址

檢查元素,找出圖片連結的位置,用webdriverObj.find_elements_by_xpath('//div[@class="mm-photoimg-area"]/a/img')提取。

程式碼如下,注意看程式碼中的註釋,其中webdriverObj.execute_script("window.scrollTo(0, document.body.scrollHeight)")是模擬把瀏覽器滾動條網下拉到底:

def get_imgurls_from_album_link(webdriverObj, album_link):
    webdriverObj.get(album_link)
    time.sleep(2)

    '''
    開啟相簿之後,相簿的圖片是動態生成的,預設只顯示一部分,
    需要網下拉滾動條才會生成更多的圖片,
    下面的程式碼是模擬網下拉滾動條到底5次。為了簡化這裡只是簡單的拉5次,
    實際上可以根據照片的數量決定拉幾次的。
    '''
for i in range(0, 5):
        webdriverObj.execute_script("window.scrollTo(0, document.body.scrollHeight)")
        time.sleep(1)

    img_elems = webdriverObj.find_elements_by_xpath('//div[@class="mm-photoimg-area"]/a/img')
    img_urls = []
    for x in img_elems:
        url = x.get_attribute('src')
        img_urls.append(url)

    return img_urls

五.下載圖片

 圖片使用urllib.urlretrieve來下載。

程式碼如下:

def download_imgs(imgurls):
    img_dir = './img'
if not os.path.exists(img_dir):
        os.makedirs(img_dir)

    for x in imgurls:
        print x
        try:
            urllib.urlretrieve(x, './img/' + os.path.basename(x))
        except urllib.ContentTooShortError, e:
            print e
            try: # 再嘗試一次下載
urllib.urlretrieve(x, './img/' + os.path.basename(x))
            except urllib.ContentTooShortError, e:
                print e
                print 'secondError: ' + x

六.測試程式碼如下

if __name__ == '__main__':
    browser = webdriver.Chrome()

    url = 'https://mm.taobao.com/json/request_top_list.htm?page=1'
model_info_links = get_model_info_links(browser, url)

    for y in model_info_links:
        album_home_links = get_model_album_home_links(browser, y)

        for z in album_home_links:
            album_links = get_model_album_links(browser, z)

            for i in album_links:
                imgurls = get_imgurls_from_album_link(browser, i)
                download_imgs(imgurls)