您的位置:首页 > 编程语言 > Python开发

python爬虫----图片爬取之高清原图

2017-07-25 11:21 429 查看
这次又来爬取图片啦,不过这次爬的是原图

大概的思路和上一篇差不多,不同的是不同的网站有不同的反爬策略

爬取的网站是:https://www.pexels.com/

1、源码分析

进入网站后会出现一个图片搜索关键词的界面,输入关键词后进入的网址是:https://www.pexels.com/search/你输入的关键词/

通过观察源码发现这些链接就是图片



因为我们要下载的是原图,所以通过点击下载会得到图片的真实网址



在网址中发现图片有2中格式,jpeg和jpg

我们可以从源码中用正则表达式获取  data-pin-media属性后面的链接或 src属性后面的链接

但这些是image.pexels.com 而 真实图片网址是 static.pexels.com

在写的时候要将他们改过来

接着看源码,发现了这个



这原来是页码的链接。本来网页是瀑布流的形式,没有点的翻页的选项。

结合上面的代码,我们可以知道一页有15张图片。而这段代码最后一个显示的是36,说明一共有36页

现在我们可以爬取多页的图片了

2、文件储存

文件操作要引用os模块

用os.makedirs(path)来创建多层的文件夹

os.path.exists判断是否有重复的文件夹或图片

每一页图片就存在一个文件夹里

3、代码

import requests
import re
import os
import time

def get_url(url):
kw = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64)'}
try:
r = requests.get(url,headers = kw)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r
except:
print('wrong!!!!!!!!!!!')

def get_photourl(photo_url):
kw = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64)'}
try:
r = requests.get(photo_url,headers = kw)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r
except:
return 'wrong'

def get_photos(url,new_fpath):
result = get_url(url)
pattern = re.compile(r'src="https://images.pexels.com/photos/(\d+)/(.*?)\?h=350&auto=compress&cs=tinysrgb"',re.S)
#真正的下载链接是static,不是images开头

items = re.findall(pattern,result.text)

for item in items:
try:
photo_url = 'https
4000
://static.pexels.com/photos/' + str(item[0]) + '/' + str(item[1])
#把图片链接中的images,改成了static
save(photo_url,item,new_fpath)
time.sleep(1)
except:
continue

def makedir(new_fpath,i,key):
E = os.path.exists(new_fpath)
if not E:
os.makedirs(new_fpath)
os.chdir(new_fpath)
print('文件夹'+ key + '_page' + str(i + 1) + '创建成功!')
else:
print('文件夹已存在!')

def save(photo_url,item,new_fpath):
Final_fpath = new_fpath + '/' +str(item[0])+str(item[1])

print('正在下载图片......')

result = get_photourl(photo_url)
if result != 'wrong':
print('下载成功!')
else:
print('失败')

E = os.path.exists(Final_fpath)

if not E:
try:
with open(Final_fpath,'wb') as f:
f.write(result.content)
except:
print('下载失败!')
else:
print('图片已存在')

def main():
key = input('请输入搜索关键词(英文):')

url = 'https://www.pexels.com/search/' + key + '/'

num = int(input('请输入一共要下载的页数:'))#默认从第1页开始下载

fpath = 'E:/python'
for i in range(num):
new_fpath = fpath + '/Photo2.0/' + key + '_page' + str(i + 1)
makedir(new_fpath,i,key)
if i >= 1:
new_url = url + '?page=' + str(i + 1)
get_photos(new_url,new_fpath)
else:
get_photos(url,new_fpath)
time.sleep(3)

main()

4、注意事项

有时候网站不会那么容易让我们爬到自己想要的东西,这时就要用一些常用的方法来解决问题

(1)在requests.get函数里改写headers中的User-agent 和 cookies。主要目的就是模拟一个

浏览器浏览网页

(2)设置等待时间,用time模块,爬取太频繁会被网站禁止爬取

5、问题分析

(1)开始在用正则表达式匹配字段的时候,itme[1]这部分是这样的pexels-photo-46274.jpeg?,多了一个问号。

我就在想会不会是"https://images.pexels.com/photos/(\d+)/(.*?)\?h=350&a 后面的那个?影响了匹配,

我就在?前面加了个\转义字符,结果就好了。还有一种办法是item[1][:-1],直接略掉那个多余的问号。

(2)这个爬虫实在太慢了,所以测试的时候只爬了2页。不过大致看了下后面页数的源码,应该没什么问题



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: