hao同学的技术博客

  • 首页
  • Java
    • Java
    • JVM教程
    • Java面试
    • Java并发入门
    • Java并发进阶
  • 项目
    • 从零打造项目
  • Python
    • Python
    • Python爬虫
    • 算法
  • Java框架
    • Spring
    • SpringBoot
  • 前端
    • Angular
  • 其他
    • Linux
    • SQL
  • 随笔
分享技术,记录人生
一个痴迷于技术的厨艺爱好者
  1. 首页
  2. Python爬虫
  3. 正文

Python实现百度贴吧图片爬取

2022年5月16日 247点热度 0人点赞 0条评论

Python实现百度贴吧图片爬取插图

Python爬虫内容都是于2019上半年写的,关于某些网站的爬取技巧可能已经过时了,仅供参考。

页面分析

我们以百度贴吧为例,爬取一些图片。

百度贴吧搜索

页面比较简单,信息提取只是关于图片地址。在代码中利用 lxml 和 Pyquery 两种方法进行解析。

# 提取图片的url
    def dealText(self, url):
        photo_urls = []
        text = self.getText(url)

        # 1,利用lxml进行匹配
        html = etree.HTML(text)
        results = html.xpath('//img[@class="BDE_Image"]/@src')

        # 2利用Pyquery进行匹配
        # doc = pq(text)
        # for i in doc('.BDE_Image').items():
        #     photo_urls.append(i.attr('src'))

        self.datas.extend(results)

图片保存及更新

将我们爬取的图片 url 进行下载保存到本地

#根据图片url下载图片
    def saveImg(self, url):
        if not os.path.exists(self.fpath):
            os.mkdir(self.fpath)
        try:
            response = requests.get(url)
            if 200 == response.status_code:
                file_path = '{0}{1}.{2}'.format(self.fpath, md5(response.content).hexdigest(), 'jpg')
                if not os.path.exists(file_path):
                    if self.img_size(response.content)[0] > 400 and self.img_size(response.content)[1] > 600:  # 图片宽*高大于400*600像素才保存
                        print('尺寸不错,留下了')
                        with open(file_path, 'wb') as fw:
                            fw.write(response.content)
                else:
                    print('Already Download', file_path)
        except requests.ConnectionError:
            print('Failed to Save Image')

由于我们要拼接图片,所以对下载的图片进行处理,保证尺寸大小一致。

    def ResizeImage(self):
        '''图片尺寸大小修改
        :param filein: 图片打开路径
        :param fileout: 图片保存路径
        :param width: 图片修改的宽度
        :param height: 图片修改的高度
        :return: 木有返回值
        '''
        images = self.get_Images()
        if not os.path.exists(self.new_fpath):
            os.mkdir(self.new_fpath)

        for i in range(len(images)):
            filein = self.fpath + images[i]
            fileout = self.new_fpath + str(i) + '.jpg'
            img = Image.open(filein)
            out = img.resize((TARGET_WIDTH, UNIT_SIZE), Image.ANTIALIAS)  # resize image with high-quality
            out.save(fileout)

图片拼接

对于上述更新后的图片进行读取,然后进行拼接。

    def get_Images(self):
        '''获取某文件夹下所有的文件名称
        :param fpath: 图片文件路径
        :return images: 图片文件名
        '''
        images = []
        for root, dirs, files in os.walk(self.new_fpath):  # 遍历文件夹下的所有文件,根文件夹下还有子文件夹,则自上而下遍历
            for f in files:
                images.append(f)
            break  # 当根文件下还有其他的文件夹时,只读取根文件夹下的文件
        return images

根据自己意愿进行拼接,输入每行每列几张图片。

    def image_Stitching(self, images, horizontal_num, vertical_num):
        '''横向纵向拼接
        :param images: 图片地址
        :param horizontal_num: 行数
        :param vertical_num: 列数
        :return: 木有返回值
        '''
        target = Image.new('RGB', (TARGET_WIDTH * horizontal_num, UNIT_SIZE * vertical_num))
        for i in range(vertical_num):
            imagefile = []
            for j in range(horizontal_num):
                img = Image.open(self.new_fpath + images[i * horizontal_num + j])
                imagefile.append(img)

            left = 0
            right = TARGET_WIDTH
            for image in imagefile:
                target.paste(image, (left, UNIT_SIZE * i, right, UNIT_SIZE * (i + 1)))  # 将image复制到target的指定位置中
                left += TARGET_WIDTH  # left是左上角的横坐标,依次递增
                right += TARGET_WIDTH  # right是右下的横坐标,依次递增
        quality_value = 100  # quality来指定生成图片的质量,范围是0~100
        target.save(self.photoWall_fpath + 'result' + str(horizontal_num) + str(vertical_num) + '.jpg',
                    quality=quality_value)

结果如下:

百度贴吧爬取结果

详细代码:https://github.com/Acorn2/yeayee/blob/master/spider/tieba_meitu.py

本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: Python 爬虫
最后更新:2022年5月16日

hresh

这是一个专注于IT技术学习交流的个人技术博客网站,包括Java学习、Python爬虫、Web开发实践等领域,深耕Java领域,内容涵盖Java基础、Java并发编程、Java虚拟机、Java面试等核心知识点。

点赞
< 上一篇
下一篇 >

文章评论

取消回复

hresh

这是一个专注于IT技术学习交流的个人技术博客网站,包括Java学习、Python爬虫、Web开发实践等领域,深耕Java领域,内容涵盖Java基础、Java并发编程、Java虚拟机、Java面试等核心知识点。

文章目录
  • 页面分析
  • 图片保存及更新
  • 图片拼接
最新 热点 随机
最新 热点 随机
后端必知:遵循Google Java规范并引入checkstyle检查 Spring Security结合Redis实现缓存功能 Spring Security结合JWT实现认证与授权 Spring Security自定义认证逻辑实现图片验证码登录 Spring Security进阶学习 Spring Security入门学习
Spring IoC之AbstractBeanFactory Spring Security进阶学习 你知道Jhsdb整合的故障处理工具吗 从 SpringBoot 1.x 升级到 2.x 的时候所踩的坑 Java 中基于各种数据类型分析 == 和 equals 的区别 Java面试准备之MySQL系列一

COPYRIGHT © 2022 hao同学的技术博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

鄂ICP备2022007381号

鄂公网安备 42010302002449号