【Python爬取网页照片——飞机图片】

一、确定目标网站

本文以某飞机图片网站为例,爬取其上的相关飞机图片。

二、分析网站

下面进行具体例子操作:
1、进入[目标网站],因涉及版权问题,网址隐去,请自行寻找相应的网站。

2、以“EC-JCU”型号的飞机为目标,我们在搜索框中输入型号,找到对应的飞机图片

3、按F12进入网页源码,在Network中选择All,刷新过后,找到所有内容中的第一项,找到"User-Agent"
在这里插入图片描述

后面我们需要对python进伪装,在那里我们用到的就是"User-Agent",防止网站发现我们是爬虫,同时我们还需要获得需要访问的目标网页,即上图所示的“referrer”

三、写程序

我们需要做的:

  1. 对python进行伪装
  2. 获得每张图片的链接
  3. 获得不同图片之间的关联性以更方便的爬取

3.1 使用python的requests模块

首先对python进行伪装,即使用得到的"User-Agent"来访问网址:

headers = {"Referer": "https://www.jetphotos.com/",
           "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36"}
url = 'https://www.jetphotos.com/photo/keyword/EC-JCU'

resq = requests.get(url=url, headers=headers)
print(resq)	# 输出为200则表示可以爬取

其中,headers 中的 Referer 为目标网址首页地址,当然一般没有 Referer 也照样能爬,但这里我还是加上了,User-Agent 即为上一小节第3步中我们从网页处获得的,直接复制过来即可,同理 url 为上一小节第3步中获得的 “referrer” 参数,接着使用 requests.get 并输出判读网页是否可以爬取;

一般进行到此处都是没有问题的,当然也有例外,我自己就遇到了一些小小的问题:使用requests访问https时出现SSLError,提示Caused by SSLError(“Can’t connect to HTTPS URL because the SSL module is not available.”,下面贴上我的解决方案值得一提的是,由于我是在虚拟环境中运行的python,在复制相应的文件时要进入到该虚拟环境对应的文件夹下(浪费了很多时间···)

当然,没有遇到上述问题的小伙伴可直接越过上一段又臭又长的文字

3.2 获得图片链接

网上有很多爬虫相关的参考文章用的都是re正则化表达式,这里我使用的是lxml.etree解析网页,相关内容的细节先留个坑以后再填,具体使用就两行代码:

html = etree.HTML(resq.text)
srcs = html.xpath(".//img/@src")

其中,以本文所爬取的网站为例,得到的 srcs 为当前网页所有图片格式所组成的列表:

srcs = [‘/assets/img/logo-white.png’, ‘/assets/img/logo-white.svg’, ‘/’, ‘//cdn.jetphotos.com/400/5/61165_1610800592.jpg’, ‘//cdn.jetphotos.com/400/6/54800_1601376663.jpg’, ‘//cdn.jetphotos.com/400/6/51236_1555710138.jpg’, ‘//cdn.jetphotos.com/400/5/94038_1554121501.jpg’, ‘//cdn.jetphotos.com/400/6/16730_1553597315.jpg’, ‘//cdn.jetphotos.com/400/6/65524_1552653611.jpg’, ‘//cdn.jetphotos.com/400/6/31976_1549569523.jpg’, ‘//cdn.jetphotos.com/400/6/86664_1549483448.jpg’, ‘//cdn.jetphotos.com/400/6/28279_1545996874.jpg’, ‘//cdn.jetphotos.com/400/6/77766_1536777522.jpg’, ‘//cdn.jetphotos.com/400/5/47453_1536686162.jpg’, ‘//cdn.jetphotos.com/400/5/45174_1536349448.jpg’, ‘//cdn.jetphotos.com/400/5/48524_1536254572.jpg’, ‘//cdn.jetphotos.com/400/5/12274_1536239863.jpg’, ‘//cdn.jetphotos.com/400/5/30880_1536230755.jpg’, ‘//cdn.jetphotos.com/400/5/69113_1536179602.jpg’, ‘//cdn.jetphotos.com/400/6/48457_1536164205.jpg’, ‘//cdn.jetphotos.com/400/6/30047_1535907490.jpg’,
‘//cdn.jetphotos.com/400/6/94127_1533322770.jpg’, ‘//cdn.jetphotos.com/400/6/82341_1531939035.jpg’, ‘//cdn.jetphotos.com/400/6/34253_1530819689.jpg’, ‘//cdn.jetphotos.com/400/5/77526_1528372702.jpg’, ‘//cdn.jetphotos.com/400/6/86109_1525893733.jpg’, ‘//cdn.jetphotos.com/400/5/22455_1525720950.jpg’, ‘//cdn.jetphotos.com/400/5/36600_1524137068.jpg’, ‘//cdn.jetphotos.com/400/5/21631_1522889416.jpg’, ‘//cdn.jetphotos.com/400/6/93280_1520447331.jpg’, ‘//cdn.jetphotos.com/400/6/72880_1518696648.jpg’, ‘//cdn.jetphotos.com/400/5/54812_1516155863.jpg’, ‘//cdn.jetphotos.com/400/6/32690_1516086769.jpg’, ‘//cdn.jetphotos.com/400/5/58369_1513832230.jpg’, ‘//cdn.jetphotos.com/400/5/67667_1513653856.jpg’, ‘//cdn.jetphotos.com/400/5/99015_1513559807.jpg’, ‘//cdn.jetphotos.com/400/6/74832_1513125647.jpg’, ‘//cdn.jetphotos.com/400/6/44535_1512577470.jpg’, ‘//cdn.jetphotos.com/400/6/74387_1512226594.jpg’, ‘//cdn.jetphotos.com/400/5/19809_1511862630.jpg’, ‘//cdn.jetphotos.com/400/6/33748_1511735030.jpg’, ‘//cdn.jetphotos.com/400/5/45229_1511616555.jpg’, ‘//cdn.jetphotos.com/400/5/43985_1511096030.jpg’, ‘//cdn.jetphotos.com/400/5/54111_1510609318.jpg’, ‘//cdn.jetphotos.com/400/6/89805_1509563352.jpg’, ‘//cdn.jetphotos.com/400/5/61237_1509545480.jpg’, ‘//cdn.jetphotos.com/400/6/50282_1509459640.jpg’, ‘//cdn.jetphotos.com/400/6/33759_1508692227.jpg’, ‘//cdn.jetphotos.com/400/5/47250_1507898953.jpg’, ‘//cdn.jetphotos.com/400/5/12389_1506378949.jpg’, ‘//cdn.jetphotos.com/400/6/61949_1506282979.jpg’, ‘//cdn.jetphotos.com/400/6/23814_1504046698.jpg’, ‘//cdn.jetphotos.com/400/5/29601_1502558507.jpg’, ‘//cdn.jetphotos.com/400/6/67216_1500719204.jpg’, ‘//cdn.jetphotos.com/400/6/78148_1494703184.jpg’, ‘/assets/img/footer-facebook.png’, ‘/assets/img/footer-twitter.png’, ‘/assets/img/footer-vk.png’, ‘/assets/img/footer-forum.png’]

通过观察我们发现,非常巧合的是,我们所需要的目标照片的后缀全部为 .jpg,且在上述列表的每个元素前面加上“https:”就可以访问到该图片,例如:我们拿到 srcs 列表中的第一个以jpg为后缀的元素:‘//cdn.jetphotos.com/400/5/61165_1610800592.jpg’,在其前面添加“https:”,得到该图片对应的链接为:‘https://cdn.jetphotos.com/400/5/61165_1610800592.jpg’,此时我们就实现了通过链接访问图片;

然鹅,细心的小伙伴会发现,上述链接访问的图片太小了,与网址中的高清大图相比有些许寒酸,我们经过仔细观察图片链接后发现,链接中藏着可以控制图片大小的因素:
在这里插入图片描述
也就是说,在这个网站中(其他网站不一定如此),我们只要把图片链接中的400改为full,即可得到清晰度不错的大图,比如上述的图片:https://cdn.jetphotos.com/400/5/61165_1610800592.jpg,大家可以试着将链接中的400改为full看看效果;

至此,我们就掌握了获得待爬取图片链接的方法

3.3 不同图片之间的关系

回到上一节的步骤3,我们在得到搜索型号为“EC-JCU”的飞机图片的网址 referer 为:‘https://www.jetphotos.com/photo/keyword/EC-JCU’,那么我们顺理成章的会想到,把“EC-JCU”改为其他的飞机型号是不是可以访问对应类型的飞机图片呢?答案是肯定的。因此我们可以将待需搜集的飞机型号放入列表中,这样就可以自动爬取我们的目标型号的飞机图片了

最后,我们可以为每种型号的飞机单独建立文件夹,将爬取到的图片放到对应的文件夹中,这样就大大节省了人工上网爬照片的时间。

3.4 完整代码

#-*- coding:utf-8 _*-
import requests
import time
from lxml import etree
import os

headers = {"Referer": "https://www.jetphotos.com/",
           "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36"}
url = 'https://www.jetphotos.com/photo/keyword/'

airName_list = ['EC-JCU', 'RA-76950']  # 待爬取飞机型号

for airName in airName_list:
    url_airName = url + airName
    # print(url_airName)

    resq = requests.get(url=url_airName, headers=headers)
    print(resq)

    html = etree.HTML(resq.text)
    srcs = html.xpath(".//img/@src")

    num = 0
    for src in srcs:
        imgname = src.split('/')[-1]
        if imgname[-4:] == '.jpg':				# 获得jpg格式的图片
            src = 'https:' + src
            src = src.replace('400', 'full', 1)	# full对应的图片清晰度较好
            # print(src)
            img = requests.get(url=src, headers=headers)
            if not os.path.exists('picture/' + airName):
                os.mkdir('picture/' + airName)
            with open('picture/' + airName + '/' + imgname, 'wb') as file:
                file.write(img.content)
            num += 1
            print('plane class:{} picture:{}'.format(airName, num))

部分运行结果:
在这里插入图片描述
可能是由于目标网址的原因,爬取速度与网络质量密切相关

参考

[1] python 爬虫获取图片(一):简单爬取
[2] Can‘t connect to HTTPS URL because the SSL module is not available - 关于anaconda中的SSL模块错误
[3] Python爬虫初级(4):lxml.etree解析网页

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值