项目:爬取皮影头茬图片(phantomjs+pyspider)

爬取皮影头茬图片(phantomjs+pyspider)

工具介绍

  • 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值