天天看點

selenium抓取動态網頁

        這世上如果有天堂,天堂應該是圖書館的模樣。   ---[阿根廷]豪爾赫·路易斯·博爾赫斯

      好開心呀,終于可以把茜茜公主圖檔批量下載下傳下來了,真是美麗的女子!因為此網頁劉亦菲的星圖粉刷牆為動态網頁,直接讀取網頁内容是得到不圖檔資訊的,是以我們需要另辟蹊徑。

在解決動态網頁中,我們通常可以采取以下兩種途徑:

1.通過抓包工具分析js,ajax的請求,模拟該請求擷取js加載後的資料(對于小白來講,還比較困難
selenium抓取動态網頁

)。

2.調用浏覽器的核心,擷取加載後的網頁源碼,然後對源碼經行解析。

本文主要使用selenium+python+BeautifulSoup的結構來進行圖檔的抓取。

     a)selenium 是一個模拟浏覽器,進行自動化測試的工具,它提供一組API可以與真實的浏覽器核心互動。它的使用方法也比較簡單。

    b)BeautifulSoup是一個用來解析網頁資訊的工具,可以從網頁中過濾出我們想要的東西。

項目目的:從劉亦菲的圖吧裡面,抓取圖檔出來,并存儲在電腦上

一。使用selenium,模拟打開浏覽器

driver = webdriver.Firefox()
driver.get('http://image.baidu.com/activity/starfans/2214592512 1383889887?&albumtype=0')
           

二、解析網頁資訊

我們先看按F12看看網頁的審查資訊,通過圖檔來進行審查元素的定位,可以看到下圖:

selenium抓取動态網頁

通過分析幾幅圖檔的資訊,我們發現,每幅圖檔的資訊格式都是一樣的,是以我們可以通過BeautifulSoup找到<div class='img-container'>元素結點,然後通過通路兩次它的兒子結點,擷取到圖檔的連結,即‘src'資訊。

三、使用PIL子產品進行圖檔的存儲

以上是大緻子產品,下面是程式代碼:

#-*-coding:utf-8  -*-
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from bs4 import BeautifulSoup
from PIL import Image
import urllib2
import StringIO
import time


driver = webdriver.Firefox()
driver.get('http://image.baidu.com/activity/starfans/2214592512 1383889887?&albumtype=0')
soup = BeautifulSoup(driver.page_source)
all = soup.find_all("div", class_="img-container")
time.sleep(2)
count =0
number=0
for each in all:
    number+=1
    picUrl = each.contents[0].contents[0]['src']
    print picUrl
    try:
        imgString=urllib2.urlopen(picUrl).read()
        im=Image.open(StringIO.StringIO(imgString))
    except:
        continue
    count += 1
    print count
    imgPath='/home/fiona/fei/photo/'+ str(count)+'.jpg'
    im.save(imgPath)

print number
driver.quit()
           

提取出來的圖檔如下:

selenium抓取動态網頁

項目問題:

一個頁面目測有60多張照片,但是隻抓取30張下來了,不知道什麼原因,有知道的可以給我留言,多謝!

參加資料:

http://selenium-python.readthedocs.org/index.html

http://www.crummy.com/software/BeautifulSoup/bs4/doc/

http://www.cnblogs.com/chenqingyang/p/3780273.html(good article)