由于网页模块化的开发,很多网页的信息加载都是通过js完成的,单纯靠解析静态网页已不能完成需求,本文通过PhantomJS来完成js的渲染,然后通过上一篇介绍的beautifusoup完成解析。
首先是安装PhantomJS,阅读官网文档。由于js需要浏览器才能运行,所以还需要一个无界面的浏览器内核工具:selenium,以及火狐驱动程序eckodriver。
为详细介绍,本文使用以下需求作为开发任务:
抓取百度图片输入关键词“ SHE”后页面显示的图片,如图:
通过查看网页源代码可以发现,此页面采用了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()
根据图片URL即可下载图片,此处由于简化次要细节默认图片格式为.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()
抓取结果示例:
SHE图片.png
网友评论