百度贴吧图片爬取,利用pillow将图片进行拼接形成照片墙
python爬取百度贴吧图片,利用Pillow拼接图片
1. 页面分析
我们以百度贴吧为例,爬取一些图片。
页面比较简单,信息提取只是关于图片地址。在代码中利用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)
2. 图片保存及更新
将我们爬取的图片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)
3. 图片拼接
对于上述更新后的图片进行读取,然后进行拼接。
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