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)