GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 1438|回复: 54
收起左侧

[实用工具] 【花马金裘】分享e621网站爬虫编写过程(以Sollyz为例)

    [复制链接] |关注本帖

新春福袋

     楼主| PPLAX 发表于 2026-2-20 09:14:35 | 显示全部楼层 |阅读模式 <


    想必有很多和我一样的人只有把喜欢的图片视频下载下来才能感觉到安心,下面分享一个e621网站的爬虫编写过程

    首先看看关键词查询时url是如何构造的
    这是直接关键词搜索的情况
    这是分页查询的情况
    url参数显然page代表页码,tags代表关键词/标签

    然后再分析一下网站,现在首次进入会出现18+界面,刚开始以为需要进行认证才能获取页面(也就是伪造token)

    不过通过分析源码发现,其实这个界面只是类似遮罩的效果,如果删除这个元素,其实是可以直接看到网页内容的,这个data-file-url就是我们要找的下载链接

    这里我们可以通过正则表达式data-file-url="(?P<url>.*?)".*?\nID: (?P.*?)\n​提取出图片的地址

    众所周知,这种页面的图片肯定是循环堆砌相同元素呈现的,也就是只要用上面的正则匹配一下,就能获得这个页面的所有地址

    代码如下:
    1. # 获得页面中的文件信息
    2. # page_text 页面的文本内容
    3. def getPageDatas(page_text):
    4.     files = []

    5.     obj = re.compile(r'data-file-url="(?P<url>.*?)".*?\nID: (?P<id>.*?)\n', re.S)
    6.     results = obj.finditer(page_text)
    7.     for result in results:
    8.         url = result.group("url")
    9.         id = result.group("id")
    10.         name = url.split('/')[-1]
    11.         file = {
    12.             "url": url,
    13.             "id": id,
    14.             "name": name
    15.         }
    16.         files.append(file)
    17.     return files
    复制代码


    当然,某个关键词的图片不一定只有一页
    所以我们需要找到所有页码,然后经过一番分析,也很容易找到class为last page​的a标签内部文本就是页码长度,所以到时候请求的时候只需要进行14次分页请求,如果有想要尝试的可以去找找这段
    这个文本应该如何提取呢,通过分析发现,在整个页面中,class="last page"只出现了一次,也就是说,使用bs4的find即可找到这个标签

    代码如下:
    1. # 获得页面数量
    2. # url 链接
    3. # headers 请求头
    4. # data 请求表单
    5. def getLastPage(url, headers, data):
    6.     try:
    7.         with requests.get(url=url, headers=headers, data=data) as resp:
    8.             bs = BeautifulSoup(resp.content, "html.parser")
    9.             a = bs.find(name="a", attrs={"class": "page last"})
    10.             last_page = (int) (a.text)
    11.     except IndexError:
    12.         last_page = 1

    13.     return last_page
    复制代码


    既然网页已经分析完毕,下面可以编写整体自动爬取的代码了
    1. import re
    2. import requests
    3. from bs4 import BeautifulSoup


    4. # 获得页面数量
    5. # url 链接
    6. # headers 请求头
    7. # data 请求表单
    8. def getLastPage(url, headers, data):
    9.     try:
    10.         with requests.get(url=url, headers=headers, data=data) as resp:
    11.             bs = BeautifulSoup(resp.content, "html.parser")
    12.             a = bs.find(name="a", attrs={"class": "page last"})
    13.             last_page = (int) (a.text)
    14.     except IndexError:
    15.         last_page = 1

    16.     return last_page

    17. # 获得页面中的文件信息
    18. # page_text 页面的文本内容
    19. def getPageDatas(page_text):
    20.     files = []

    21.     obj = re.compile(r'data-file-url="(?P<url>.*?)".*?\nID: (?P<id>.*?)\n', re.S)
    22.     results = obj.finditer(page_text)
    23.     for result in results:
    24.         url = result.group("url")
    25.         id = result.group("id")
    26.         name = url.split('/')[-1]
    27.         file = {
    28.             "url": url,
    29.             "id": id,
    30.             "name": name
    31.         }
    32.         files.append(file)
    33.     return files

    34. # 获得下载的多线程任务数组,要await
    35. # keyword 搜素的关键词
    36. # path 下载路径
    37. def resolve(keyword, path):
    38.     # 若关键词为空,返回空数组,防止请求到一堆数据
    39.     if keyword == '':
    40.         return []
    41.     # 请求头
    42.     headers = {
    43.         "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.54"
    44.     }
    45.     # 链接
    46.     url = "https://e621.net/posts?"
    47.     # 表单
    48.     data = {
    49.         "page": 1,
    50.         "tags": keyword
    51.     }
    52.     # 获得最后一页的页码
    53.     lastPage = getLastPage(url=url, headers=headers, data=data)
    54.     print("获取到总页数为{}".format(lastPage))
    55.     # 获得页面文本
    56.     print("目前正在处理:e621...")
    57.     page_texts = []
    58.     while data["page"] <= lastPage:
    59.         print("正在抓取获取第" + str(data["page"]) + "个页面的内容")
    60.         with requests.get(url=url, headers=headers, data=data) as resp:
    61.             page_texts.append(resp.text)
    62.         data["page"] += 1
    63.     # 创建任务列表
    64.     for page_text in page_texts:
    65.             files = getPageDatas(page_text)
    66.             i = 0
    67.             for file in files:
    68.                 url = file["url"]
    69.                 with requests.get(url=url, headers=headers) as response:
    70.                     if response.status_code == 200:
    71.                         # 以二进制写入模式保存文件到本地
    72.                         with open('{}/{}-{}'.format(path, file["id"], file["name"]), 'wb') as file:
    73.                             file.write(response.content)
    74.                             i = i+1
    75.                         print("文件下载成功!")
    76.                     else:
    77.                         print("下载失败,状态码:", response.status_code)

    78. if __name__ == '__main__':
    79.     resolve('Sollyz', 'C:\\Users\\14586\Desktop\\test')
    复制代码

    当然我们知道,requests​库是阻塞式的,当要下载的图片有成百上千个时,下载的等待时间甚至不如自己手动点击去下载,这时候就需要多线程出马了,于是我请ai老师帮我生成了一套使用场景是qt5且能够多线程进行的请求库:
    1. 字数满了,果咩......
    复制代码
    并让他基于以上两套代码编写了对应的图形化界面爬虫代码

    最终效果如图,如果重复下载的话会自动跳过这一条:




    工具和本次爬取结果在附件,请查收

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    评分

    参与人数 2血液 +5 追随 +2 堕落 +1 收起 理由
    xiaohuhuwu~ + 1
    野生阿努厨 + 5 + 1 + 1 三连献上

    查看全部评分

    回复

    使用道具 举报

    炼金之心『随时随地开启!』破损的旧书『随时随地开启!』雪王的心脏人鱼之泪苏格兰圆脸胖鸡[Pro Max]位面引航器不曾寄出的信件幽灵竹筒

      凯诺斯 发表于 2026-2-20 09:26:14 | 显示全部楼层 <
      回复

      使用道具 举报

      福卡·曙红[4]福卡·澄黄[1]福卡·锰紫[7]鎏彩万幢男巫之歌女巫之路虚空之海的鲸業火死鬥实现梦想官复原职

        娱乐法师火布偶 发表于 2026-2-20 09:30:08 | 显示全部楼层 <
        回复

        使用道具 举报

        福卡·曙红[3]福卡·澄黄[2]福卡·锰紫[5]剑指撒冷『冰雕马拉橇』【圣诞限定】心心念念小雪人官复原职岛田源氏里昂‧S‧甘乃迪

          枫_Age 发表于 2026-2-20 09:45:42 | 显示全部楼层 <
          回复

          使用道具 举报

          瑞雪兆丰年,生灵万物新福卡·曙红[3]福卡·澄黄[2]福卡·锰紫[5]药剂背袋魔法石碑质量效应三部曲吃完的面包

            Chare 发表于 2026-2-20 09:52:43 | 显示全部楼层 <
            虽然说现在有gallery-dl也可以下载像是e站或者fa站的资源,但是手写一个爬虫程序我觉得也很是不容易,尤其楼主这个还有界面还是方便不少。不过之前用gallery-dl确实会有些小问题,就是它会直接下载图片的原图,而这些原图一般会非常大,有时候下下来我还得再压缩一遍。挺好奇有没有办法可以下载这些网页的预览图而不是原图大小呢
              收起(1)
            回复

            使用道具 举报

            萨赫的蛋糕黑暗交易雷霆晶球石肤术思绪骤聚附魔金苹果茉香啤酒史莱哲林

              lqiang1990 发表于 2026-2-20 09:59:29 | 显示全部楼层 <
              回复

              使用道具 举报

              没有梦想的咸鱼阿努比斯信徒

                野生阿努厨 发表于 2026-2-20 10:27:55 | 显示全部楼层 <
                回复

                使用道具 举报

                林中之蛋瑞雪兆丰年,生灵万物新超人力量腕带驯化红龙幼崽福卡·锰紫[7]福卡·澄黄[2]

                  Z_Long 发表于 2026-2-20 10:34:43 | 显示全部楼层 <
                  回复

                  使用道具 举报

                  業火死鬥魔法不朽·传奇不熄不舍的挽留帅气的本・比格十年一梦炽焰咆哮虎炙热的格拉迪欧拉斯永浴爱河男巫之歌虚空之海的鲸

                    Burry 发表于 2026-2-20 10:39:00 | 显示全部楼层 <
                    回复

                    使用道具 举报

                    福卡·曙红[6]福卡·澄黄[6]福卡·锰紫[6]『落樱缤纷』马上發迁徙之歌新春福袋『住在GM村』『召唤好运的角笛』终极闪光

                      notunicorna 发表于 2026-2-20 10:44:24 | 显示全部楼层 <
                      回复

                      使用道具 举报

                      福卡·澄黄[6]福卡·锰紫[6]福卡·曙红[6]

                        Alicen2233 发表于 2026-2-20 10:46:46 | 显示全部楼层 <
                        回复

                        使用道具 举报

                        新春福袋

                           楼主| PPLAX 发表于 2026-2-20 10:54:42 | 显示全部楼层 <
                          回复

                          使用道具 举报

                          福卡·曙红[2]福卡·澄黄[2]福卡·锰紫[2]塞拉斯虚空藤蔓超人擎天柱(Peterbilt389)光明奇幻木偶小丑与格雷与星光璀璨无瑕的回忆

                            枫叶UC 发表于 2026-2-20 10:59:02 | 显示全部楼层 <
                            本帖最后由 枫叶UC 于 2026-2-20 11:00 编辑

                            可以使用组合词吗?+和-的那种
                            如果第二次爬取会跳过已有项目吗?
                              收起(3)
                            回复

                            使用道具 举报

                            腐化龙幼崽寻觅红龙幼崽

                              Sloanx 发表于 2026-2-20 11:17:55 | 显示全部楼层 <
                              回复

                              使用道具 举报

                              龙腾世纪:审判最终幻想XIV赛博朋克2077很久很久以前最终幻想XVIDante亚瑟‧摩根人间之神迷途羔羊

                                Xiaoshi 发表于 2026-2-20 11:22:53 | 显示全部楼层 <
                                回复

                                使用道具 举报

                                  Cheng2025 发表于 2026-2-20 11:32:02 | 显示全部楼层 <
                                  回复

                                  使用道具 举报

                                  卡斯迪奥肥皂上古卷轴V:天际阿列克西欧斯(Alexios)安德森‧戴维斯罗根光之战士赛博朋克2077福卡·锰紫[2]

                                    kook 发表于 2026-2-20 12:00:22 | 显示全部楼层 <
                                    回复

                                    使用道具 举报

                                    福卡·曙红[2]福卡·澄黄[7]福卡·锰紫[8]虚空之海的鲸明日之子卡洛斯·奥利维拉永远的克叔索林·临终一役被释放的灵魂隐秘的讯息

                                      KurisuV 发表于 2026-2-20 12:07:04 | 显示全部楼层 <
                                      回复

                                      使用道具 举报

                                      飘飘出动!史莱哲林福卡·曙红[6]福卡·澄黄[9]福卡·锰紫[8]诺曼底号男巫之歌缘起星空夏之歌丹雀衔五穗,人间始丰登

                                        凯登 发表于 2026-2-20 12:43:35 | 显示全部楼层 <
                                        回复

                                        使用道具 举报

                                        元灵化法杖超人能量和弦Walko Duck福卡·澄黄[0]福卡·锰紫[1]福卡·曙红[2]青鸾

                                          点击输入文字 发表于 2026-2-20 12:47:51 | 显示全部楼层 <
                                          回复

                                          使用道具 举报

                                          您需要登录后才可以回帖 登录 | 立即注册

                                          本版积分规则

                                          关闭

                                          站长公告上一条 /2 下一条

                                          文字版|手机版|小黑屋|GameMale

                                          GMT+8, 2026-2-28 05:30 , Processed in 0.283372 second(s), 146 queries , Redis On.

                                          Copyright © 2013-2026 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表