js 抓取网页内容(网页模块化的开发,完成js的渲染完成解析)
优采云 发布时间: 2021-09-24 10:48js 抓取网页内容(网页模块化的开发,完成js的渲染完成解析)
由于web页面的模块化开发,很多web页面的信息加载都是通过JS完成的。仅仅通过解析静态网页来完成需求是不可能的。本文通过phantomjs完成JS的渲染,然后通过前一篇文章中介绍的beautiful soup完成解析
首先,安装phantomjs并阅读官方网站文档。因为JS需要一个浏览器来运行,所以它还需要一个没有接口的浏览器内核工具:Selenium和Firefox驱动程序Ecko驱动程序
为了详细介绍,本文使用以下需求作为开发任务:
抓取百度图片,在关键词“她”之后输入页面显示的图片,如图所示:
她喜欢照片
通过查看网页源代码,我们可以发现这个页面是通过使用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()
抓取结果示例:
她喜欢照片