热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

半次元热门图片,各种好看的cosplay小姐姐,统统爬取收藏

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。以下文章来源于云+社区,作者py3study转载地址前言边学习

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

以下文章来源于云+社区,作者 py3study

转载地址

https://www.gaodaima.com/fei347795790?t=1

www#gaodaima.com来源gao($daima.com搞@代@#码网

前言

边学习,边创造是一件开心的事情,因为你会清楚的认识到自己的状态,以及那充满内心的成就感,因此从写爬虫开始学习python是一个简单粗暴的提升路线,不知不觉了解很多东西

这里以半次元为例对爬虫整体流程以及部分细节进行简单汇总,如果有不正确的地方还请大家指出

 

话不多说,我们打开待爬的页面

 

会发现这个页面运用了ajax技术,只有向下滑动才会触发请求,如果我们按照现在页面地址爬取,也只能是得到部分相册,既然是ajax,这里我们打开F12 网络工具 刷新页面

 

滑动到底部,会发现又多了四条GET请求,查看请求的url ,会发现这些url之间不同的只有 p 的值 p=1, p=2, p=3, p=4,p=5

 

知道了这些,就可以开始编写python文件,请求页面内容了

1、创建一个AlbumUrl类 , 开始获取页面所有相册的url

import requests
from bs4 import BeautifulSoup


album_urls = []  #相册url列表

headers = {
        "Host": "bcy.net",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0"
    }


#获取相册url
class AlbumUrl():

    def __init__(self, url, url2):
        self.url = url
        self.url2 = url2
    def page(self, start, end):

        for i in range(start, end):

            url = self.url % i
            response = requests.get(url, headers=headers)

            response.encoding = "utf-8"
            after_bs = BeautifulSoup(response.text, "lxml")

            li_s = after_bs.find_all("li", class_="js-smallCards _box")   #提取li标签内容

            for li in li_s:
                list_a = li.find_all("a", class_="db posr ovf")    #提取a标签内容
                for a in list_a:
                    a_href = a.get("href")   #取出部分url 进行拼接
                    album_urls.append(self.url2 + a_href)



if __name__ == "__main__":
    url = "https://bcy.net/coser/index/ajaxloadtoppost?p=%s"
    url2 = "https://bcy.net"
    spider = AlbumUrl(url, url2)
    spider.page(1, 6)       #分析出来的页数

 

编写完毕,运行一下, 无误,把这些相册url保存到列表,等待逐个分析里面的图片内容

 

2、新建一个ImgUrl类 继承threading.Thread类 因为这里我打算用多线程, 导入相应的模块

import requests
from bs4 import BeautifulSoup
import threading
import re
import time


album_urls = []  #相册url列表
all_img_urls = []       #所有图片

lock = threading.Lock()  #互斥锁

headers = {
        "Host": "bcy.net",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0"
    }

#抓取每个相册里面图片url
class ImgUrl(threading.Thread):

    def run(self):

        while len(album_urls) > 0: #只要不为空 就一直抓取
            lock.acquire()  #上锁
            album_url = album_urls.pop()
            lock.release()  # 解锁

            try:
                response = requests.get(album_url, headers=headers, timeout=3)
                response.encoding = "utf-8"
                re_obj = re.compile(""path(.*?)w650", re.S)
                r = (re_obj.findall(response.text))
                print("正在分析" + album_url)
                after_bs = BeautifulSoup(response.text, "lxml")

                lock.acquire()  # 上锁
                for title in after_bs.find_all("title"):
                    global album_title
                    album_title = (str(title.get_text())).split("-")[0]

                for i in range(len(r)):
                    img_url = r[i].replace(r"u002F", "/")[5:] + "w650.jpg" #拼接字符串,完成每张图片url

                    img_dict = {album_title: img_url}   #相册名和图片url存入字典
                    all_img_urls.append(img_dict)
                print(album_title + "获取成功")

                lock.release()  # 解锁
                time.sleep(0.5)
            except:
                pass



#获取相册url
class AlbumUrl():

    def __init__(self, url, url2):
        self.url = url
        self.url2 = url2
    def page(self, start, end):

        for i in range(start, end):

            url = self.url % i
            response = requests.get(url, headers=headers)

            response.encoding = "utf-8"
            after_bs = BeautifulSoup(response.text, "lxml")

            li_s = after_bs.find_all("li", class_="js-smallCards _box")   #提取li标签内容

            for li in li_s:
                list_a = li.find_all("a", class_="db posr ovf")    #提取a标签内容
                for a in list_a:
                    a_href = a.get("href")   #取出部分url 进行拼接
                    album_urls.append(self.url2 + a_href)



if __name__ == "__main__":
    url = "https://bcy.net/coser/index/ajaxloadtoppost?p=%s"
    url2 = "https://bcy.net"
    spider = AlbumUrl(url, url2)
    spider.page(1, 5)       #分析出来的页数
    for x in range(5):
        t = ImgUrl()
        t.start()
 

# 这里需要注意的是,图片的url并不是直接暴露的,里面掺杂了一些字符串,这里我们运用正则来进行筛选,然后用replace进行相应字符串的替换

开五个线程运行一下, 无误,可以准备写入文件了

 

3、新建一个Download类 同样继承threading.Thread类 ,用于下载图片到本地

import os

import requests
from bs4 import BeautifulSoup
import threading
import re
import time


album_urls = []  #相册url列表
all_img_urls = []       #所有图片

lock = threading.Lock()  #互斥锁

headers = {
        "Host": "bcy.net",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0"
    }




#抓取每个相册里面图片url
class ImgUrl(threading.Thread):

    def run(self):

        while len(album_urls) > 0: #只要不为空 就一直抓取
            lock.acquire()  #上锁
            album_url = album_urls.pop()
            lock.release()  # 解锁

            try:
                response = requests.get(album_url, headers=headers, timeout=3)
                response.encoding = "utf-8"
                re_obj = re.compile(""path(.*?)w650", re.S)
                r = (re_obj.findall(response.text))
                print("正在分析" + album_url)
                after_bs = BeautifulSoup(response.text, "lxml")

                lock.acquire()  # 上锁
                for title in after_bs.find_all("title"):
                    global album_title
                    album_title = (str(title.get_text())).split("-")[0]

                for i in range(len(r)):
                    img_url = r[i].replace(r"u002F", "/")[5:] + "w650.jpg" #拼接字符串,完成每张图片url

                    img_dict = {album_title: img_url}
                    all_img_urls.append(img_dict)
                print(album_title + "获取成功")

                lock.release()  # 解锁
                time.sleep(0.5)
            except:
                pass

num = 0
#下载图片
class Download(threading.Thread):

    def run(self):

        while True:

            lock.acquire()   #上锁
            if len(all_img_urls) == 0:
                lock.release() #解锁
                continue
            else:
                img_dict = all_img_urls.pop()
                lock.release() #解锁

                for key, values in img_dict.items():   #把键值取出

                    try:
                        os.mkdir(key)
                        print(key + "创建成功")
                    except:
                        pass
                    global num
                    num += 1
                    filename = str(num) + "." + str(values).split(".")[-1]  #给每张图片重新命名
                    filepath = os.path.join(key, filename)
                    session = requests.Session()     #这里使用会话请求
                    http_obj = requests.adapters.HTTPAdapter(max_retries=20)  #每次连接的最大失败重试次数
                    session.mount("https://", http_obj)  #增加请求类型
                    session.mount("http://", http_obj)
                    try:
                        response = session.get(values)   #读取会话

                        with open(filepath, "wb", buffering=4*1024) as image:
                            image.write(response.content)
                            image.close()

                            print(filepath + "下载完毕")
                    except:
                        pass

                time.sleep(0.1)


#获取相册url
class AlbumUrl():

    def __init__(self, url, url2):
        self.url = url
        self.url2 = url2
    def page(self, start, end):

        for i in range(start, end):

            url = self.url % i
            response = requests.get(url, headers=headers)

            response.encoding = "utf-8"
            after_bs = BeautifulSoup(response.text, "lxml")

            li_s = after_bs.find_all("li", class_="js-smallCards _box")   #提取li标签内容

            for li in li_s:
                list_a = li.find_all("a", class_="db posr ovf")    #提取a标签内容
                for a in list_a:
                    a_href = a.get("href")   #取出部分url 进行拼接
                    album_urls.append(self.url2 + a_href)



if __name__ == "__main__":
    url = "https://bcy.net/coser/index/ajaxloadtoppost?p=%s"
    url2 = "https://bcy.net"
    spider = AlbumUrl(url, url2)
    spider.page(1, 5)       #分析出来的页数
    threads = []
    for x in range(5):
        t = ImgUrl()
        t.start()
        threads.append(t)

    for tt in threads:  #设置堵塞,避免线程抢先
        tt.join()

    for x in range(5):
        down = Download()
        down.start()

好,开五个线程运行一下,看结果如何

 

 

到此为止,三步爬取半次元热门图片,演示完毕,其实不光是热门,我们也可以换成别的链接进行分析爬取,包括全站,整体原理都是类似的,一些请求细节需要理解



推荐阅读
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有