爬蟲實例——通過JS控制滾動條


案例

某位淘女郎的某個相冊

有能力的童鞋可以先嘗試一下爬取每張照片的鏈接。

我曾經嘗試過幾種方法,下面一一介紹:

第一種方法,采用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秒鍾,再循環比較,直到最新的值不比上一次的值大為止。


免責聲明!

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



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