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

这次又来爬取图片啦,不过这次爬的是原图

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

爬取的网站是: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://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页。不过大致看了下后面页数的源码,应该没什么问题






  • 28
    点赞
  • 172
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值