scrapy框架爬取某壁纸网站美女壁纸 + MySQL持久化存储

news2024/11/25 6:26:31

文章目录

  • 准备工作
    • 创建项目:
    • 设置(settings)
  • 主程序入口meinv.py
    • 思路
    • 源代码
  • items 配置
  • 管道pipelines
    • 源代码
  • 效果图
  • 总结


准备工作

创建项目:

scraoy startproject bizhi
cd bizhi
scrapy genspider meinv bizhi360.com

设置(settings)

在里面添加这些参数

LOG_LEVEL = "ERROR"  #设置允许显示的日志
IMAGES_STORE = "./meinvtupian"  #创建本地保存图片的地址

在设置里开启并添加管道

ITEM_PIPELINES = {
    "bizhi.pipelines.BizhiPipeline": 303,  #管道的优先级,越小越优先
    "bizhi.pipelines.MeinvPipeline": 301,
}

主程序入口meinv.py

思路

分析网站原码可以看到图片在一个个li标签里面,点进去才是我们需要的大图,OK,思路有了,拿小图—>得到大图地址–>再次请求大图–>保存
在这里插入图片描述
在这里插入图片描述

源代码

import scrapy
from bizhi.items import BizhiItem


class MeinvSpider(scrapy.Spider):
    name = "meinv"
    allowed_domains = ["www.bizhi360.com"]
    start_urls = ["http://www.bizhi360.com/meinv/", "http://www.bizhi360.com/dongman/"]

    def parse(self, response):
        # print(response.text)
        # 通过xpath得到所有的li标签
        li_s = response.xpath('//*[@id="main"]/div/div[1]/ul/li')
        for li in li_s:
        	# 遍历li拿到里面所有的大图地址
            href = li.xpath('./a/@href').extract_first()
            # print(response.urljoin(href))
            # 请求刚才得到的大图地址
            yield scrapy.Request(
                url=response.urljoin(href),
                method='get',
                callback=self.two_parse  # 回调函数,当响应回馈之后,如何处理
            )
            # break

    def two_parse(self, response):
    	# 接收上面返回的数据,拿到图片的名字,地址
        names = response.xpath('//h1/text()').extract_first().strip() + '.jpg'
        hrefs = response.xpath('//*[@id="main"]/div/div[1]/div[2]/figure/a/@href').extract_first()
        print(names, hrefs)
        # 提前定义好BizhiItem并调用
        item = BizhiItem()
        item['name'] = names
        item['img_src'] = hrefs
        # 必须要有返回值,不然第二个管道收不到数据
        yield item

items 配置

import scrapy


class BizhiItem(scrapy.Item):
    name = scrapy.Field()  # 图片名字
    img_src = scrapy.Field()  # 图片地址
    local_src = scrapy.Field()  # 图片保存在本地的地址

管道pipelines

这里要创建两个存储管道,一个是本地,一个是MySQL

源代码

from itemadapter import ItemAdapter
from scrapy.pipelines.images import ImagesPipeline
import scrapy
import pymysql
from bizhi.items import BizhiItem

# 数据库存储管道
class BizhiPipeline:
	# open_spider是scrapy内置,声明在程序开始做些什么,这里我们连接本地的mysql数据库
    def open_spider(self, spider):
        self.conn = pymysql.connect(
            host='localhost',
            user='root',
            password='root',
            database='spider',
            port=3306
        )
	# 同样为scraoy内置,程序结束之后关闭数据库连接
    def close_spider(self, spider):
        if self.conn:
            self.conn.close()

    def process_item(self, item, spider):
        # print(item)
        # 创建游标
        cursor = self.conn.cursor()
        # 执行SQL语句进行保存
        sql = "INSERT INTO spider.picture(name, img_src, local_src) VALUES (%s, %s, %s)"
        cursor.execute(sql, (item['name'], item['img_src'], item['local_src'],))
        # self.conn.commit()
        return item

# 本地存储管道
class MeinvPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):  # 负责下载
        return scrapy.Request(item['img_src'])  # 直接返回一个请求

    def file_path(self, request, response=None, info=None, item=BizhiItem):  # 准备文件路径
        # file_name = request.url.split('/')[-1]
        file_name = item['name']
        return f"img/{file_name}"
    def item_completed(self, results, item, info):  # 返回文件的详细信息
        print(results[0][1]['path'])
        # print(info)
        item['local_src'] = results[0][1]['path']  # 从返回的文件信息里拿到图片的本地地址
        return item

效果图

本地:
在这里插入图片描述
数据库:
在这里插入图片描述

总结

完美运行,跑了两页,下载更多主程序搞个循环就好,数据库存储过程中,数据库,表,记得提前创建,我没有用代码创建,程序还有很多可以改进的地方,就这样吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/450532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS学习第二十九节——URDF之joint

此处留疑问,link,joint的origin子标签到底是怎么样的一种位置关系??? https://download.csdn.net/download/qq_45685327/87717336 urdf 中的 joint 标签用于描述机器人关节的运动学和动力学属性,还可以指定关节运动的…

大数据-玩转数据-IDEA创建Maven工程

一、 IDEA集成Maven插件 打开IDEA,进入主界面后点击 file,然后点击 settings,在上面的快捷查找框中输入maven,查找与maven相关的设置,然后点击maven 修改maven的路径(使用本地的Maven),以及修…

【流畅的Python学习笔记】2023.4.22

此栏目记录我学习《流畅的Python》一书的学习笔记,这是一个自用笔记,所以写的比较随意 元组 元组其实是对数据的记录:元组中的每个元素都存放了记录中一个字段的数据,外加这个字段的位置。简单试试元组的特性: char…

kong(1):Kong介绍

Kong是一款基于OpenResty(Nginx Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,…

复旦大学郁喆隽:网络制造出人的“幻象”,深度思考如何可能?

“人是什么?”这是亘古以来人们反复追问的一个古老命题。从元宇宙到ChatGPT,这个人人都在讨论、理解和实践互联网的时代,对“人”的自我定义和认知产生了哪些影响?    在3月12日复旦大学-华盛顿大学EMBA项目主办的“复调艺文沙龙”上&am…

计算长方形、三角形、圆形的面积和周长

系统设计框图: 图形模块的 概要设计(设计数据结构和接口): 数据结构: float 表示面积和周长 长方形的数据(一般typedef都是定义在对应模块的头文件中) typedef struct{ float width; float he…

三菱GX Works2梯形图程序分段显示设置的具体方法示例

三菱GX Works2梯形图程序分段显示设置的具体方法示例 大家平时在使用GX Works2进行梯形图程序编辑时,默认是一整段在一起,程序步数较多时查看起来不是那么方便,下面就和大家分享如何通过声明编辑来实现程序分段显示。 具体方法可参考以下内容: 如下图所示,打开GX Works2编…

数据结构与算法(一):基础数据结构 算法概念、数组、链表、栈、队列

判断一个数是否是2的N次方? N & (N-1) 0 (N > 0)算题: 力扣 https://leetcode.cn/POJ http://poj.org/ 算法 算法概念 算法代表: 高效率和低存储 内存占用小、CPU占用小、运算速度快 算法的高效率与低存储:内存 C…

Oracle 定时任务job实际应用

Oracle 定时任务job实际应用 一、Oracle定时任务简介二、dbms_job涉及到的知识点三、初始化相关参数job_queue_processes四、实际创建一个定时任务(一分钟执行一次),实现定时一分钟往表中插入数据4.1 创建需要定时插入数据的目标表4.2 创建定…

如何为Google Play的应用制作宣传视频

在用户打开我们的应用页面时,最先看到的是宣传视频,这是吸引潜在用户注意力的绝好机会,所以这对于 Google Play 来说是一件大事。 宣传视频和屏幕截图一起,都是引导用户去使用我们应用程序的第一步,能够让他们一打开应…

sibelius西贝柳斯2023中文版是什么打谱软件?如何下载

Sibelius是一款专业的音乐制谱软件,被广泛用于各类音乐创作、教育、表演等领域。通过Sibelius,用户可以快速、准确地制作各种类型的音乐谱面,同时支持多种音乐符号和效果的编辑、自定义和输出,可谓是音乐领域的必备工具之一。Sibe…

SQL Server tempdb 闩锁争用

当你反复创建和删除 TempDb 对象(临时表、表变量等)时,你可能会在 tempdb 中看到页面的闩锁争用。当你注意到tempdb 上的 PAGELATCH_* 争用(sysprocesses 中的等待资源以 2: 开头)时,请检查闩锁等待是否在 …

【语音之家】AI产业沙龙 —— 三星语言智能团队ICASSP2023论文分享会

由CCF语音对话与听觉专委会 、中国人工智能产业发展联盟(AIIA)评估组、三星电子中国研究院、语音之家、希尔贝壳共同主办的【语音之家】AI产业沙龙——三星语言智能团队ICASSP2023论文分享会,将于2023年4月25日18:30-20:20线上直播。 沙龙简介…

ERP系统有哪些功能模块?

一、ERP系统是什么 现在市面上的管理软件有很多,不少企业都会去选择一些操作简单便捷的软件,优化工作流程,提高工作效率,其中ERP系统就是常见的一种,ERP是企业资源计划(Enterprise Resource Planning)的简称&#xff…

深入了解Lock同步锁的优化

大家好,我是易安。 今天我们来简单谈谈在JDK1.5之后,Java提供的Lock同步锁。 相对于需要JVM隐式获取和释放锁的Synchronized同步锁,Lock同步锁(以下简称Lock锁)需要的是显示获取和释放锁,这就为获取和释放锁…

防止机械/移动硬盘休眠 - NoSleepHD

防止机械/移动硬盘休眠 - NoSleepHD 前言解决方案计算机硬盘移动硬盘 前言 机械硬盘休眠后唤醒需要一定时间,且频繁的启动和停止并不有利于硬盘的寿命,因此可根据自身需求防止机械硬盘休眠,下文以Win10系统为例介绍解决方案。 值得一提的是…

Java核心技术 卷1-总结-9

Java核心技术 卷1-总结-9 使用异常机制的技巧为什么要使用泛型程序设计定义简单泛型类泛型方法类型变量的限定 泛型类型的继承规则 使用异常机制的技巧 1.异常处理不能代替简单的测试。 使用异常的基本规则是:只在异常情况下使用异常机制。 2.不要过分地细化异常。…

第三章(3):深入理解Spacy库基本使用方法

第三章(3):深入理解Spacy库基本使用方法 本章主要介绍了Spacy库的基本使用方法,包括安装、加载语言模型、分句、分词、词性标注、停用词识别、命名实体识别、依存分析和词性还原等内容。重点介绍了每个步骤的具体实现方式和应用场…

【TortoiseGit】安装和配置

转自 【TortoiseGit】TortoiseGit安装和配置详细说明_No8g攻城狮的博客-CSDN博客 一、TortoiseGit 简介 TortoiseGit 是基于 TortoiseSVN 的 Git 版本的 Windows Shell 界面。它是开源的,可以完全使用免费软件构建。 TortoiseGit 支持你执行常规任务,…

出道即封神的ChatGPT,现在怎么样了?ChatGPT想干掉测试人员,做梦去吧

从互联网的普及到智能手机,都让广袤的世界触手而及,如今身在浪潮中的我们,已深知其力。 前阵子爆火的ChatGPT,不少人保持观望态度。现如今,国内关于ChatGPT的各大社群讨论,似乎沉寂了不少,现在…