測試環境:python2.7 + beautifulsoup4.4.1 + selenium2.48.0
測試網址:http://tieba.baidu.com/p/2827883128
目的是下載該網頁下所有圖片,共160+張。可以分為以下幾步:
1、獲取網頁源代碼。
發現直接通過urllib2或者request獲取到的源代碼和實際圖片對應不起來,通過chrome審查元素功能可以查詢到對應的圖片,猜測是該頁面的圖片加載是通過ajax異步傳輸的。因此使用工具selenium + chromedriver實現。安裝好selenium+chromedriver之后,即可獲取到需要的源代碼。
2、分析獲取到的源代碼,找出圖片的實際地址然后下載。過程與python爬蟲2——下載文件類似。之前分析源碼都是直接通過正則表達式實現,建議學習下beautifulsoup(現在就去),更方便。
實際程序運行后發現,只能獲取到40張圖片。原因是頁面加載完成后,只有40張圖片。如果需要獲取全部圖片,需要在頁面加載完成之前,手動往下滑動滾輪,之后瀏覽器繼續發送ajax請求給服務器,獲取其他的圖片。該方法實際測試可行,可以獲取全部圖片。
但是!手動操作這種方法太low了!以下是我的猜想:1、是否可以直接通過分析源代碼中的js部分,直接提取出所有向后台服務器發送ajax請求的代碼,一次性發送出去從而得到所有圖片的地址? 2、是否可以通過js或者selenium,在加載頁面的時間段,模擬滾輪動作,從而實現功能。方法2我實際測試了下,由於水平有限,不熟悉js,沒有成功。附代碼:
# -*- coding: utf-8 -*- import requests from bs4 import BeautifulSoup from selenium import webdriver driver = webdriver.Chrome() url = "http://tieba.baidu.com/p/2827883128" driver.get(url) try: # driver.implicitly_wait(20) # driver.find_element_by_id("ag_main_bottombar") # js="var q=document.body.scrollTop=10000" # driver.execute_script(js) sourcePage = driver.page_source soup = BeautifulSoup(sourcePage, "lxml") images = soup.find_all(class_ = "ag_ele_a ag_ele_a_v") print(len(images)) for image in images: print(image) finally: # pass driver.quit()