由于網(wǎng)頁模塊化的開發(fā)桥帆,很多網(wǎng)頁的信息加載都是通過js完成的嘹黔,單純靠解析靜態(tài)網(wǎng)頁已不能完成需求伶贰,本文通過PhantomJS來完成js的渲染愁溜,然后通過上一篇介紹的beautifusoup完成解析。
首先是安裝PhantomJS,閱讀官網(wǎng)文檔豪嗽。由于js需要瀏覽器才能運(yùn)行谴蔑,所以還需要一個無界面的瀏覽器內(nèi)核工具:selenium,以及火狐驅(qū)動程序eckodriver。
為詳細(xì)介紹龟梦,本文使用以下需求作為開發(fā)任務(wù):
抓取百度圖片輸入關(guān)鍵詞“ SHE”后頁面顯示的圖片隐锭,如圖:
通過查看網(wǎng)頁源代碼可以發(fā)現(xiàn),此頁面采用了js異步加載圖片完成计贰,故需要先將js信息渲染完成钦睡,然后才能完成解析工作。
代碼如下:
#coding:utf-8
from selenium import webdriver
from bs4 import BeautifulSoup
# browser = webdriver.Firefox(executable_path="/Users/brave/geckodriver/geckodriver")
browser = webdriver.PhantomJS()
browser.get("http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=SHE")
soup = BeautifulSoup(browser.page_source, 'html.parser')
imgpage = soup.find("div",class_="imgpage")
list = imgpage.find_all("li",class_="imgitem")
print(len(list))
for i in range(1,len(list)):
imagitem = list[i]
imageURL = imagitem["data-objurl"]
savePath = "/Users/brave/Documents/python/SHE/" + str(i) +".jpg"
print(savePath)
try:
saveImage(imageURL,savePath)
except:
print(imageURL)
browser.quit()
根據(jù)圖片URL即可下載圖片躁倒,此處由于簡化次要細(xì)節(jié)默認(rèn)圖片格式為.jpg荞怒,代碼如下:
def saveImage(imageURL,savePath):
# headers = {'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:55.0) Gecko/20100101 Firefox/55.0'}
# req = urllib.request.Request(url=imageURL, headers=headers)
# data = urllib.request.urlopen(req).read()
data = urllib.request.urlopen(imageURL).read()
fout = open(savePath, "wb")
fout.write(data)
fout.close()
抓取結(jié)果示例: