中年大叔学Python第7课------零基础爬虫爬取F1图片

目录

1. 编者按

2. 项目概述-F1图片爬取

3. 详细步骤说明

3.1 获取URL地址

3.1.1 注释语句说明

3.1.2  导入库

3.1.3 获取URL

3.2 检查网页获取图片下载地址

3.3 使用正则方法获取地址

3.4 UA反爬虫

3.5 使用os建立指定路径的文件夹

3.6 遍历列表批量存储

4. 运行结果

5. 结论


1. 编者按

作为中年大叔本叔,在积累了10年工程经验后一直幻想出圈,爬虫作为其中的一项必备技能,最近一周一直在孜孜不倦的学习Python和爬虫这也是我开辟这个中年大叔学Python专栏的原因。

不忘初心,砥砺前行。

使用的知识包括:

  • 为了实现对地址的快速获取,本文使用了正则方法,具体使用.*?和(.*?)方法;
  • 为了存储文件,导入os库,进行文件夹的建立;
  • 导入的库包括:os,re和requests。

2. 项目概述-F1图片爬取

由于大叔本人是一个F1车迷,所以,本次爬虫的第一个项目就是爬取图片网站的F1赛车图片。

具体步骤分为:

1. 获取URL地址:找到一个图片网站,并搜索得到F1图片的初步结果;

2. 在浏览器按下F12(大叔使用谷歌浏览器),并对网页进行检查分析,找到每一个图片对应的地址及地址的分层;

3. 使用正则方法获取图片下载地址的字符串,并形成列表list;

4. 使用os建立空文件夹

5. 遍历列表,并存储图片至指定文件夹。

3. 详细步骤说明

3.1 获取URL地址

3.1.1 注释语句说明

编写开头的说明文件,至于为何要编写这两行注释代码,且听下回分解

#!/usr/bin/python 
# -*- coding: utf-8 -*-

3.1.2  导入库

导入os、re和requests库。

import requests
import re
import os

3.1.3 获取URL

在bing搜索引擎(抵制百度,从我做起!)搜索F1,得到图片网站地址,并进入网站搜索F1,得到以下页面:

说实话,虽然网站画风诡异,颇有后现代上世纪90年代初设计风格。但是,看到红色法拉利,还是口中默念沃法已完,哎,并且将该地址赋值给字符串变量url

# 指定URL
url = 'https://www.ivsky.com/search.php?q=F1'

3.2 检查网页获取图片下载地址

对该网页,按下F12进行网页检查,逐个找到网页中对应图片的下载地址。这里有个使用技巧,当鼠标放在某个代码段时,在网页相应的作用区域会变成蓝色,暗示你编辑的是本段内容。所以,通过逐层筛选,很快就可以找到对应的代码段。

通过上图可以看到,每一组<li>...<li>对应一个图片。

拷贝一组class对应图片的element值。

<div class="il_img pic_box"><a href="/tupian/f1_saiche_v54804/pic_856952.html" target="_blank"><img src="https://img.ivsky.com/img/tupian/t/201812/28/f1saiche-013.jpg" alt="赛场上的F1赛车图片 4239x1804"></a></div>

3.3 使用正则方法获取地址

从上面字符串分析,其中的img src为图片的地址,即字符串中标识的红色部分。下面采用正则方法获取全部div class=il_img pic_box类中img src字符串内容,并存入列表。

在正则方法使用时,使用.*?方法和(.*?)方法。

ex = '<div class="il_img pic_box">.*?<img src="(.*?)" alt=.*?</div>' img_src = re.findall(ex,page_txt,re.S) # 如果正则作用在数据解析环节中,则使用re.S

上述正则表达式表示的含义是:

ex为返回值,返回是列表,列表中每一个元素都是img src中的内容。

正则表达式查找的内容表示:以<div class="il_img pic_box">.作为开头,中间各种乱七八糟的内容不管,之后为<img src=“”的内容,双引号内为(.*?)表示需要提取的内容。

此部分的代码为:

# 对页面中所有的图进行解析
ex = '<div class="il_img pic_box">.*?<img src="(.*?)" alt=.*?</div>'
img_src = re.findall(ex,page_txt,re.S) # 如果正则作用在数据解析环节中,则使用re.S

由此得到ex反馈的列表值img_src,打印出结果看一下:

3.4 UA反爬虫

UA 伪装:将对应的user agent封装到一个字典中,并且在获取页面时,作为变量反馈。

如果不加UA伪装,则python发起的获取网络连接在Network属性中会显示使用python发起,从而被网站堵截。

# UA 伪装:将对应的user agent封装到一个字典中
headers = {
    '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'
}
# 获取整张页面对应的源码数据
page_txt = requests.get(url=url,headers=headers).text

3.5 使用os建立指定路径的文件夹

在创建文件夹之前先判读是否该文件夹已经存在,即使用os.path.exists()来判断,如果没有则使用os.mkdir()函数来建立。

# 创建一个文件夹,保存全部图片
if not os.path.exists('D:/Data-SD/F1图片保存'):
    os.mkdir('D:/Data-SD/F1图片保存')

3.6 遍历列表批量存储

所有准备工作已经完成,下面开展批量存储。

遍历存储时,以此读取list中每一个元素,并分为3个步骤开展后续设计:

1. 图片数据使用二进制形式进行获取,即使用request.get().content

2. 为了实现图片存储,对图片的名称进行设定,图片名称按照网站获取的文件名称来命名。使用split()函数进行分解并取最后一个元素作为文件名;

3. 按照wb形式,写入文件,并提示进度。

for src in img_src:
    img_data = requests.get(url=src,headers=headers).content
    # 生成图片名称
    imgname = src.split('/')[-1]
    imgPath = 'D:/Data-SD/F1图片保存/'+imgname
    with open(imgPath,'wb') as fp:
        fp.write(img_data)
    print(imgname,'下载成功\n')

4. 运行结果

在运行界面显示已经完成图片存储。

目标文件夹内容:

5. 结论

原来昨天想爬取下航天集团的网站,获取我国火箭历年发射时间和次数。但是上网站却发现人家网站是表格形式的。。。还需要看下如何爬取网页表格数据,后面继续学习继续更新,欢迎大家关注和支持。

 

 

 

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值