工具介绍
- phantomjs是一款可编程的无头浏览器(拥有完整的浏览器内核,包括js解析引擎、渲染引擎,请求处理等,但不包括显示和用户交互界面的浏览器)
- pyspider是一款爬虫框架,在anaconda虚拟环境中安装使用,对初学者友好,搭载phantomjs后可爬取动态页面(在crawl函数中添加参数:
fetch_type='js'
)。但是现在多用scrapy了。
项目代码
此代码粘贴到pyspider项目中使用。
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2020-05-12 21:16:26
# Project: piying
from pyspider.libs.base_handler import *
import os
import requests
def save_image(url, title, root):
"""
传入图片的资源地址,图片名称,和图片要待的文件夹路径,保存单张图片
"""
image_name = title + '.' + url.split('.')[-1] # 获取图片名称:xxx.xxx
try:
# 如果文件夹不存在,就创建该文件夹
if not os.path.exists(root):
os.makedirs(root)
else:
pass
image_path = root + r'\{0}'.format(image_name) # 注意:反斜杠是怎么处理的
# 如果图片不存在,就写入图片
if not os.path.exists(image_path):
r = requests.get(url)
with open(image_path, 'wb') as f:
f.write(r.content)
f.close()
print("文件保存成功")
else:
print("文件已存在")
except:
print('执行出错')
class Handler(BaseHandler):
crawl_config = {
}
def __init__(self):
"""
定义基地址,爬取开始页和总页码
"""
self.total_num = 5 # 这一类共有total_num页
self.base_url = 'http://shadow.caa.edu.cn/api/picture.json?order-by=sort&order-by=id&page='
self.page_num = 0 # 和page_num2一一对应
self.base_url2 = '&page-size=40&hidden=false&unpaged=false&category=%E5%A4%B4%E8%8C%AC-%E7%94%9F-%E6%96%87%E7%94%9F*&_='
self.page_num2 = 1589289970311
@every(minutes=24 * 60)
def on_start(self):
while self.page_num < self.total_num:
url = self.base_url + str(self.page_num) + self.base_url2 + str(self.page_num2)
self.crawl(url, callback=self.index_page, save={'dir': str(self.page_num)}) # save用来传值
self.page_num += 1
self.page_num2 += 1
@config(age=10 * 24 * 60 * 60)
def index_page(self, response):
page_info = response.json['content'] # 一个列表,元素是字典,字典的元素是一张图像的各项信息
root = r'C:\PersonalFile\文生' + r'\{0}'.format(response.save['dir'])
# 遍历每一份图片信息
i = 0
for image in page_info:
i += 1
title = str(i) + image['title'] # 图像的名称(不含后缀)
url = 'http://shadow.caa.edu.cn' + image['url'] # 图像的资源地址
save_image(url, title, root) # 保存图像
项目成果
目标网站:皮影数字博物馆
结果展示:爬取了所有“文生”类的图片。在网站中,“文生”类别的图片一共有40页。每页有40张图像。文件存储即按照该结构组织。如下图所示,每一个文件夹对应1页的图片,每一个文件夹内有该页的40张图片。
参考资料
[1] https://cuiqingcai.com/2652.html
[2] https://zhuanlan.zhihu.com/p/33105389
[3] https://zhuanlan.zhihu.com/p/21479334