Python实现百度贴吧图片爬取

hresh 471 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

发表评论 取消回复
表情 图片 链接 代码

分享