爬取美女图片保存本地与入MySQL库(宅男福利)

2023-10-26

本文详细记录如何爬取美女图片,并将图片下载保存在本地,同时将图片url进行入库。保存在本地肯定是为了没事能拿出来养养眼啊,那入库就是为了定位图片啊,要懂点技术的话,还能搬运搬运做个小图片网站,不为别的,就是养眼和学习!

本文主要讲思路和方法,源码、数据库、图片文件获取方式见文末

作者博客(图片效果更明显):https://blog.jiumoz.com/archives/pa-qu-mei-nv-tu-pian-bao-cun-ben-de-yu-ru-mysql-ku

  • 先看效果
    在这里插入图片描述

image-20221112145037368请添加图片描述

思路部分

解析目标网址

大家看上面的截图肯定就发现了,这网址不寻常(手动狗头),现在这些网站国内都很难活的,网站就不贴出来了。

查看网站情况

查看首页可以基本确定数据加载方式,是分页加载的方式

确定分页加载方式

一般就是两种加载方式,一种是直接改变url,就想旧版的微博,就是直接改变url请求新的网页即可,另一种就是ajax,一般涉及到ajax就比较麻烦,可能有token啥的,不过技术而言,都比较简单,请求就完事。

再看本网站,点击加载更多后,浏览器的url并没有改变,说明就是ajax,那么直接F12打开控制台,调到网络栏,清空信息

在这里插入图片描述

再点击加载更多,我们想要的东西就有了。

在这里插入图片描述

解析分页请求

双击我们抓到的包,查看包的请求网址、请求方法、载荷、响应

image-20221112152606707

  • 请求网址

    即为我们发送请求的地址;

  • 请求方法

    我们发送请求要用到的方法,很重要,后面写代码就要根据这个来,方法错了请求不到数据;

  • 载荷

    查看请求的时候给服务器传递了哪些数据,也很重要,取不取得到正确我们想要的数据就完全看这个内容了;

    image-20221112152801218

  • 响应

    响应的内容就是我们需要的数据,进一步解析就能获得的数据了。

    image-20221112152957567

到这里就还没解决一个问题,这个问题就是载荷字段的解析,如上可以发现就是四个字段:id、action、type、paged,其实每个字段都比较好理解,不出意外的话,前三个字段就是死的,主要就是paged字段了,为了验证猜测,再请求一下,查看两个包载荷的不同之处就好了。方法一样,这里就不演示了。事实也证明了我们的猜测,改变paged字段就好。

查看网页结构

继续F12,查看元素,就能发现是一个又一个的li标签了,每个li可以点击进入到对应主题的图片详情界面,得到了这个信息就简单了,就很好获取详情页的url了。

在这里插入图片描述

但是页面url没变,不可能通过首页这一个url就能获取到全站的内容,所以还得看看上一步抓的包,如下。

是不是和想象中的不一样,这里是直接请求的网页代码而不是数据,那对于我们来说就更简单了,全文用一种url提取方法就好,将data下的html字段转为html对象就行。

image-20221112154331904

图片详情页

前面说那么多,也都是再讲如何提取每个主题的详情url,具体的图片获取还得是进入详情页啊;

点进来看看,进来一看,发现就是一个一个img标签,那更好了,直接提取图片url就好啊。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-31aPnzBY-1668248824826)(https://kodo.jiumoz.com/imgs/QQ%E6%88%AA%E5%9B%BE20221112154813.png)]

但是!!!竟然要VIP,细心的小伙伴应该和我一样,并没有慌啊,为什么呢,看下文

image-20221112155011545

解除VIP限制

确切来说是绕开限制,也就是针对本网站有效,属于是瞎猫碰上死耗子。

回到主题,为什么发现有限制的时候不慌呢,大家在看看图片详情页的网页元素,是不是发现了一些猫腻,所有的图片url,就那一点点地方不一样啊,那我们还爬什么网页,直接构造图片url不就得了。

image-20221112155453110

构造图片url

  • 思路

看上面的不同之处,就大致知道每个主题下的图片url规律了,那我们知道第一张图片的url后,构建后面图片的url就好嘛,至于构建到多少,首页和详情页都有,如下,构建这么多就好啦!

在这里插入图片描述

  • 方法

思路很简单,但是构建肯定没那么简单,要确定数字变化的位置、数字的位数、提取数字部分、进行计算、拼接字符串…多看一下网站,会发现这些图片url并不是最后那个数据不一样,并不规则。

但是也不难,就是麻烦点,那就是获取两个url,进行url对比,先提取两个字符串的数字部分形成一个数组,然后对比两个数组中不同的部分,如果不同,获取其下标,根据下标获取到url中那个数字字符串,根据数字字符串进行url分割,再计算和拼接,说的有点泛泛,具体的看代码,此方法还有bug,大家可以再研究一下

img_id_list1 = re.findall(r"\d+\d*",url1)
img_id_list2 = re.findall(r"\d+\d*", url2)
index = 0
for i in range(len(img_id_list1)):
    if(img_id_list1[i] != img_id_list2[i]):
        index = i
        break
img_id = img_id_list1[index]  #图片末尾标识
img_url_pre = url1.split(img_id)[0] # 提取分割后的前半部分
img_url_end = url1.split(img_id)[1] # 提取分割后的后半部分
for i in tqdm(range(img_num)):
    img_id_int = int(img_id) # 提取的数字字符串转为int型
    img_id_len = len(img_id) # 提取的数字字符串长度
    img_id_main_int = img_id_int + i # 数字+1
    img_id_main_int_len = len(str(img_id_main_int)) # 加1后长度
    img_id_use = '0'*(img_id_len-img_id_main_int_len) + str(img_id_main_int) # 补0
    imgurl = img_url_pre+img_id_use+img_url_end # 得到图片url
代码部分

请求主题url与基本信息

很简单,利用request包发送请求,利用JSON包解析得到的数据,再利用lxml模块进行url获取就好啦!部分代码如下,不能直接用哦,断断续续的:

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}


def img_get(page):
    start_url = 'https://XXXXXX/admin-ajax.php'
    data = {
        'id': 0,
        'action': 'postlist_newajax',
        'type': 'index',
        'paged': page
    }
    import json
    try:
        response = requests.post(start_url, headers=headers, data=data)
        # 序列化成json字符串
        json = json.loads(response.text)
        if (json['success'] == 'ok'):
            # 请求到的html
            # print (json['data']['html'])
            html = etree.HTML(json['data']['html'], parser=etree.HTMLParser(encoding='utf-8'))
            # a标签
            a_rr = html.xpath('//a[@target="_blank"]')
            a_re = '<a href="(.*?)"'
            # 多少张图片
            img_num = html.xpath('//div[@class="postlist-imagenum"]/span')
            # 标题
            img_file_title = html.xpath('//div[@class="case_info"]/a')

获取图片url

同样的办法,不过要先获取到前两张图片url,方法如上,xpath获取就行。代码如下,也不能直接用哦:

response = urllib.request.urlopen(a_href[0]).read().decode("utf-8", "ignore")
img_data = etree.HTML(response)  # 转换格式,构造解析对象
img_src1 = img_data.xpath('//*[@id="image_div"]/img[1]/@src')  # 进行匹配,提取出来的内容不是列表
if (str(type(img_src1)) == "<class 'list'>"):
    pass
else:
    img_src1 = [i for i in img_src1]
    img_src2 = img_data.xpath('//*[@id="image_div"]/img[2]/@src')  # 进行匹配,提取出来的内容不是列表
    if (str(type(img_src2)) == "<class 'list'>"):
        pass
    else:
        img_src2 = [i for i in img_src2]
        # print("此页第一张图片链接:",img_src1[0])
        # print("此页第二张图片链接:", img_src2[0])

保存到本地

方法很简单,代码如下(本示例代码是单独的保存图片代码):

# -*- coding: utf-8 -*-
# @Time: 2022/11/3 15:08
# @Author: MinChess
# @File: save_pic.py
# @Software:
import os
import datetime
import urllib.request

# 创建目录,并返回该目录
def make_dir(path):
    # 去除左右两边的空格
    path = path.strip()
    # 判断该文件是否存在,不存在才创建,存在则跳过
    if not os.path.exists(path):
        os.makedirs(path)
    return path

# 图片保存地址
save_img_path = 'D:\program files\Pytest\Spider\图片获取\pic\\'

path = make_dir(save_img_path)
# 命名图片
filename = path + datetime.datetime.now().strftime('%Y%m%d%H%M%S%f') + '.jpg'
# 打开文件
f = open(filename, 'wb')
# 请求图片
req = urllib.request.urlopen('https://kodo.jiumoz.com/halo/Group-screen.png')
# 解析请求
buf = req.read()
# 写入图片
f.write(buf)

写入数据库

也很简单,建好库,连接后根据字段写好语句就行,主要用到的包是pymysql,代码如下:

def mysql_db(route,url,info,name):
    conn = pymysql.connect(
        host="127.0.0.1",
        database="picture",
        user="xxxx",
        password="xxxx"
    )

    try:
        with conn.cursor() as cursor:
            sql = "insert into sn (route,url,info,name) values ('"+route+"','"+url+"','"+info+"','"+name+"')"
            cursor.execute(sql)
            conn.commit()
    except Exception as e:
        conn.rollback()
        print("数据库操作异常:\n", e)
    finally:
        conn.close()

源码、数据库、爬取的图片

  • 源码

    内服详细的注释,新手也会

    地址:https://yiandrive.com/s/VkvRFy

  • 数据库

    数据库共有34000余条数据,包括名称、标题、url(可外链)、路径等字段;

    数据库保留了一个空字段,需要的同学可以将图片写入自己的服务器或者图床,这样图片链接的有效性更有保障。

    地址:https://yiandrive.com/s/E6amc1


感谢观看!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬取美女图片保存本地与入MySQL库(宅男福利) 的相关文章

  • Python串口通信

    我正在开发一个 Arduino 项目 由于内存限制 我将其与 Python 脚本连接起来 在Python方面 我有一个二维矩阵 其中包含各自的x y坐标值 并且在此列表中有26000个坐标对 因此 为了向大家澄清数据结构 pathlist
  • C++ OpenCV 2.3 中缺少 MoveWindow()

    我正在使用 OpenCV 2 3 的 C 版本 并且正在努力完成一项基本任务 我想做的是创建一个窗口并将其移动到屏幕上的特定位置 例如使用 cv namedWindow My Window 1 cv MoveWindow My Window
  • 在 Heroku 应用程序中同时运行 Django 和 Node

    我想在我的 heroku 实例上同时运行 django 应用程序和节点应用程序 这是我的进程文件 web python manage py runserver 0 0 0 0 PORT web node bin node modules a
  • 如何在多个端口上运行 FastAPI 应用程序?

    我有一个 FastAPI 应用程序 正在使用 Uvicorn 以编程方式在端口 30000 上运行 现在我也想在端口 8443 上运行相同的应用程序 相同的应用程序需要在这两个端口上运行 我怎样才能在Python代码中做到这一点 最小可重现
  • Python,将CSV文件转换为SQL表

    我有一个没有标题的 CSV 文件 并尝试从文件中的某些列创建 SQL 表 我尝试了这里给出的解决方案 使用 Python 将 CSV 文件导入 sqlite3 数据库表 https stackoverflow com questions 2
  • Redis SYNC 套接字上的错误情况:连接被拒绝

    在我的 django 应用程序中使用 celery 和 redis 一切都工作正常 直到我遇到了问题 redis 文件的位置已更改 redis 无法访问它们 经过查找 原来这是由于网络随机攻击造成的 需要添加confg 我添加文件后 一段时
  • 我应该如何优化这个文件系统 I/O 绑定程序?

    我有一个 python 程序 它执行如下操作 从 csv 文件中读取一行 对其进行一些变换 将其分解为实际的行 因为它们将被写入数据库 将这些行写入单独的 csv 文件 除非文件已完全读取 否则返回步骤 1 运行 SQL Loader 并将
  • Python pandas cumsum() 在达到最大值后重置

    我有一个 pandas DataFrame 其中 timedeltas 作为这些增量的累积和 在单独的列中以毫秒表示 下面提供了一个示例 Transaction ID Time TimeDelta CumSum ms 1 00 00 04
  • 单击按钮时执行 python 脚本

    我有一个带有一个按钮的 HTML 页面 当我们单击该按钮时 我需要执行一个 python 脚本 并返回到包含结果的同一 HTML 页面 所以我需要对返回值进行一些验证并执行一些操作 这是我的代码 HTML
  • 如何使用生成器遍历文件系统?

    我正在尝试创建一个实用程序类来遍历目录中的所有文件 包括子目录和子子目录中的文件 我尝试使用发电机 因为发电机很酷 然而 我遇到了困难 def grab files directory for name in os listdir dire
  • scikit-learn - 具有置信区间的 ROC 曲线

    我可以使用 ROC 曲线scikit learn with fpr tpr thresholds metrics roc curve y true y pred pos label 1 where y true是基于我的黄金标准的值列表 即
  • 将 Pandas 列转换为日期时间

    我在 pandas DataFrame 中有一个字段以字符串格式导入 它应该是一个日期时间变量 如何将其转换为日期时间列 然后根据日期进行过滤 Example raw data pd DataFrame Mycol 05SEP2014 00
  • 如何在 python 中将 selenium webelement 转换为字符串变量

    from selenium import webdriver from time import sleep from selenium common exceptions import NoSuchAttributeException fr
  • 如何让 list_blobs 表现得像 gsutil

    我只想获得 GCS 上假文件夹结构的第一级 如果我运行例如 gsutil ls gs gcp public data sentinel 2 tiles 我得到一个这样的列表 gs gcp public data sentinel 2 til
  • 如何使用 python / pywinusb 将 hid 数据发送到设备?

    我正在尝试使用 pywinusb 将输出报告发送到 pic18f4550 该设备可以接收数据 我已经使用 C 应用程序对其进行了测试 效果很好 另外 我可以使用 pywinusb 从设备读取数据 但我在尝试发送数据时遇到问题 这是我正在运行
  • Python 用 lambda 函数封闭作用域变量

    我写了这个简单的代码 def makelist L for i in range 5 L append lambda x i x return L 好的 现在我打电话 mylist makelist 因为稍后调用嵌套函数时会查找封闭范围变量
  • Python:从 apache authnz_ldap 获取用户

    我正在通过 Apache2 的 authnz ldap 模块成功验证 ldap 用户 我不清楚如何在他们登录后获取他们的用户名 以便我可以通过任何以下表单 网页与他们交互 我尝试过典型的方法 os getenv os environ get
  • Mac OS X 上的 Python 框架和非框架构建之间的差异

    Question Mac OS X 上的 Python 框架构建和非框架构建 即标准 UNIX 构建 之间有什么区别 另外 各自的优点和缺点是什么 初步研究 以下是我在发布此问题之前找到的信息 Pythonmac SIG Why is Fr
  • Seaborn 分组条形图,使用总值而不是平均值

    我有一个关于如何组织数据以使用 seaborn 制作条形图的问题 我的数据输入如下所示 influencer platform reach person a instagram 10000 person b instagram 5000 p
  • 将下载的字体添加到 Tkinter

    我想下载一个开源字体并在我的 Python Tkinter 程序中使用它 如何告诉 Tkinter 从目录导入字体或将字体放在与程序相同的文件夹中 Note 我已经寻找答案一段时间了 甚至阅读了 Tkinter 的 API 参考 了解我能找

随机推荐

  • 基于HAL库的stm32f103c8t6的快速开发笔记(简易版)—— 5、STM32的PWM输出(附舵机控制)

    1 概念了解 首先了解到 PWM生成是在通用定时器的基础上配置的 每个通用定时器都有多路通道输出PWM信号 这里以TIM4 定时器4 为例 在图形配置面板找到TIM4的通道一作为PWM输出管脚 其管脚为PB6 打开左侧定时器配置面板 可以看
  • HBase工作机制

    1 图示 2 组件说明 Client hbase客户端 1 包含访问hbase的接口 比如 linux shell java api 2 除此之外 它会维护缓存来加速访问hbase的速度 比如region的位置信息 Zookeeper 1
  • 【MySQL】基础SQL语句——库的操作

    文章目录 一 创建数据库 1 1 基础语句 1 2 字符集和校验规则 1 3 校验规则对读取数据的影响 二 查看数据库 三 修改数据库 四 删除数据库及备份 4 1 删除 4 2 备份和还原 结束语 一 创建数据库 1 1 基础语句 最简洁
  • 微信小程序期末大作业 点餐小程序

    点餐小程序 小程序如图所示 下载链接在文末 点我下载资源 https download csdn net download weixin 43474701 58000564
  • xshell连接ubuntu失败排错指南

    本人在学习linux系统中出现了一些远程连接失败的问题 以此笔记记录下排错过程 注意 VMware桥接模式需要让虚拟机的ip和物理机的ip在同一网段 因此需要手动配置linux系统网卡 NAT模式虚拟机ip不需要和物理机ip在同一个网段 但
  • Python Tkinter详解 (二)Label标签的使用

    一个简单到不能再简单的标签 import tkinter as tk window tk Tk window title Label的使用 window geometry 400x400 label tk Label window text
  • 【动手学深度学习v2】第二章预备知识-2.1入门

    入门 深度学习领域方向自然语言处理 计算机视觉 深度学习 具体领域 图片分类 物体检测与分割 样式迁移 为图片加滤镜 人脸合成 文字生成图片 文字生成 无人驾驶 张量 表示一个多维矩阵 核心是一个数据容器 多数情况下包含数字 可以想象成一个
  • Java中WebService接口的生成、打包成.exe、设置成Windows服务、及其调用、Apache CXF调用

    一 Java中WebService接口的生成 1 在eclipse工具中新建一个普通的JAVA项目 新建一个java类 JwsServiceHello java package com accord ws import javax jws
  • 蓝桥杯2014年第五届真题-拼接平方数

    题目 题目链接 题解 实现题 题目大意 将一个区间内的数拆成两个数后 若原数 拆得的第一个数和拆得的第一个数均为平方数则输出 直接遍历区间内所有的数可能会超时 因此我们直接取区间内的平方数 只遍历区间内的平方数 时间复杂度会降很多 对于每个
  • Windows和Linux下共享内存使用

    源码地址 https github com ylmbtm GameProject3 看过我开源代码的朋友知道 我这个项目在逻辑服和数据服进行数据同步采用的就是共享内存 其实数据同步的方式有很多种 其中使用较多的一种方式就是tcp网络协议同步
  • CSS布局的三种机制:浮动

    CSS布局的三种机制 浮动 浮动 float 为什么要学习浮动 什么是浮动 float 浮动小结 浮动的应用 清除浮动 为什么要清除浮动 清除浮动本质 清除浮动的方法 额外标签法 隔墙法 父级添加overflow属性方法 使用after伪元
  • jdk的安装

    由于要使用jmeter进行接口自动化测试 而jmeter的使用 必要要安装jdk 因此就在网上随便找了一篇jdk的安装教程 由于我喜欢自定义安装 结果费了半天时间也没安装成功 前期后后安装与卸载不下5次 最后决得可能是jdk不能自定义安装的
  • 接口设计说明书模板

    目 录 1 引言 1 1 1 设计目标 1 1 2 适用范围 1 1 3 相关术语 1 1 4 参考资料 1 2 分析设计 1 2 1 设计思想 1 2 2 接口结构 1 2 3 数据流分析 2 3 中间库接口 2 3 1 中间库说明 2
  • java面试官如何面试别人

    java面试官如何面试别人 一 java面试官的 面试心得 在公司当技术面试官几年间 从应届生到工作十几年的应聘者都遇到过 先表达一下我自己对面试的观点 1 笔试 面试去评价一个人肯定是不够准确的 了解一个人最准确的方式就是 路遥知马力 日
  • OCR-字体颜色与背景颜色区分不明显的调研

    需解决的问题 对于一些图片 字体和颜色区分度不高 白色字体的图片进行图像增强时容易使字体更加 模型识别时存在漏检现象 图像增强后有些文字将会变得不清晰甚至消失 解决的方法 图像的二值化 以下使用了七种方法进行测试 Python代码 impo
  • shell筛选log

    服务器跑 pbs 脚本的时候 会分配一个 job ID 并相应地创建两个文件
  • anaconda和python版本的对应关系

    https docs anaconda com anaconda packages oldpkglists Anaconda与Python版本对应关系 官方最新
  • KernelSU: 内核 ROOT 方案, KernelSU KernelSU KernelSU 新的隐藏root防止检测 封号方案

    大约一年多以前 我在一篇讲Android 上 ROOT 的过去 现在和未来https mp weixin qq com s biz MjM5Njg5ODU2NA mid 2257499009 idx 1 sn 3cfce1ea7deb6e0
  • 年终总结——旧的收获与新的开始

    引言 收获本身分为俩部分 一个就是旧经历的收获 另外就是新路程的规划 概述 旧的一年已然逝去 那我们是否颗粒归仓 新的一年即将开始 我们是否规划好新的旅程 内容 颗粒归仓 从没有思考过一年的时光竟如此之短 不知不觉之间又到了颗粒归仓的瞬间
  • 爬取美女图片保存本地与入MySQL库(宅男福利)

    本文详细记录如何爬取美女图片 并将图片下载保存在本地 同时将图片url进行入库 保存在本地肯定是为了没事能拿出来养养眼啊 那入库就是为了定位图片啊 要懂点技术的话 还能搬运搬运做个小图片网站 不为别的 就是养眼和学习 本文主要讲思路和方法