案例
有能力的童鞋可以先嘗試一下爬取每張照片的鏈接。
我曾經嘗試過幾種方法,下面一一介紹:
第一種方法,采用requests和BeautifulSoup:
import requests from bs4 import BeautifulSoup url = 'https://mm.taobao.com/self/album_photo.htm?spm=719.6642053.0.0.4JUVfm&user_id=687471686&album_id=10000702574&album_flag=0' bs = BeautifulSoup(requests.get(url).text, 'lxml') print len(bs('div', 'mm-photoimg-area'))
通過這種方法是得不到任何照片的,因為這個網站的照片是通過JS加載的,requests獲取的源代碼只是最基本的源代碼,里面不含任一照片的鏈接。
第二種方法,采用selenium、PhantomJS和BeautifulSoup:
# -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') from bs4 import BeautifulSoup from selenium import webdriver url = 'https://mm.taobao.com/self/album_photo.htm?spm=719.6642053.0.0.4JUVfm&user_id=687471686&album_id=10000702574&album_flag=0' driver = webdriver.PhantomJS() driver.get(url) bs = BeautifulSoup(driver.page_source, 'lxml') print len(bs('div', 'mm-photoimg-area'))
如無意外,你得到的結果應該是16,也就是16張圖片,但是,如果你嘗試滾動網頁,你會發現其實並不止16張照片,這是因為淘寶采用的是ajax技術,只有通過下拉滾動條才會加載新的照片。
在網上查了好多資料都沒找到解決方案,最后自己想了個辦法:
# -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') import time from bs4 import BeautifulSoup from selenium import webdriver url = 'https://mm.taobao.com/self/album_photo.htm?spm=719.6642053.0.0.4JUVfm&user_id=687471686&album_id=10000702574&album_flag=0' driver = webdriver.PhantomJS() driver.get(url) js1 = 'return document.body.scrollHeight' js2 = 'window.scrollTo(0, document.body.scrollHeight)' old_scroll_height = 0 while(driver.execute_script(js1) > old_scroll_height): old_scroll_height = driver.execute_script(js1) driver.execute_script(js2) time.sleep(3) bs = BeautifulSoup(driver.page_source, 'lxml') print len(bs('div', 'mm-photoimg-area'))
如無意外,你得到的結果應該是45,也就是45張照片,這也是該相冊的照片總數。
下面介紹一下這段代碼的原理:
原理
通過js1可以獲取body對象的高度,通過js2可以下拉滾動條。
先將上一次獲取的body對象的高度(old_scroll_height)設為0,然后獲取最新的body對象的高度,跟上一次獲取的進行比較,如果比上一次的值大,就把最新的值賦值給old_scroll_height,然后下拉滾動條,休眠3秒鍾,再循環比較,直到最新的值不比上一次的值大為止。
