一、爬虫环境
1.python版本:python 3
2.anaconda
3.requests模块
4. PyCharm编辑器
二、安装环境
1.安装anaconda
在anaconda官网https://www.anaconda.com/进行下载(如果看不懂英文可以用谷歌浏览器或者QQ浏览器打开)
选择下载python3.6版本(根据自己电脑系统下载32位或64位)进行安装。
2.用anaconda安装requests模块
以管理员身份运行anaconda(我也不知道为什么要用管理员身份运行,好像是以为之前安装别的东西没用管理员运行总
是安装出错)
不管了,就用管理员安装。在anaconda中输入:conda install requests 进行安装
由于我安装过了就不安装了,输入:y 就会继续安装了。安装完成可以输入:conda list 查看
在其中就可以找到requests,requests安装完成。
3.安装PyCharm编辑器
在https://www.jetbrains.com/pycharm/中进行下载并安装。在安装完PyCharm后一定要记得配置,如果电脑中有多
个python版本一定要配置为你安装的anaconda路径中的python.exe,否则安装的requests模块会导入不了。
4.PyCharm的配置
打开PyCharm 点File -> settings
按截图点击进入
进入此页面后点击Proje:Python ->Project Interpreter在右边选择anaconda安装路径中的Python.exe,
再点击右下角OKPyCharm配置完成。
三、代码部分
1.requests模块的使用
用requests模块向网页发送get请求,在此之前先介绍一下今天要爬取的网站“http://unsplash.com
import requests #导入requests库
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'} #给请求指定一个请求头来模拟chrome浏览器
res = requests.get('https://unsplash.com') #像目标url地址发送get请求,返回一个response对象
print(res.text) #r.text是http response的网页HTML
这样就可以输出网页源代码,输出结果为
第一步完成,有没有一丝丝成就感?
2.分析网页源代码
在浏览器中打开http://unsplash.com网站按F12再点图中的选择元素(建议用谷歌浏览器,我发现IE浏览
器查找到的元素对应源码和PyCharm获取到的有一些差别)
再在网页中点击一张图片
点击后此元素的源码部分就找到了,这个图片的网络地址就是下图中蓝色的部分
你可以对比多个图片元素的网络地址,接下来考虑考虑怎么用python代码把这些网络地址一一摘出来。
3.用正则表达式摘出图片网络地址
写到此处我突然发现很难受,这个网页的源代码和我前几天写的时候有一点变动我之前写的正则表达式不
能用了,下来就说说正则表达式的用法吧,你在学习的时候再临时分析正好加深学习。
先找几个元素代码对比一下
<img itemprop="thumbnailUrl" data-test="standard-photo-grid-multi-col-img" sizes="(min-width: 1335px) 416px,(min-width: 992px) calc(calc(100vw - 72px) / 3), (min-width: 768px) calc(calc(100vw - 48px) / 2), 100vw" srcset="https://images.unsplash.com/photo-1521780372272-bb5e0f455dcf?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=ca8871f351fa47ea3f969912a157b235&auto=format&fit=crop&w=100&q=60 100w,
<img itemprop="thumbnailUrl" data-test="standard-photo-grid-multi-col-img" sizes="(min-width: 1335px) 416px, (min-width: 992px) calc(calc(100vw - 72px) / 3), (min-width: 768px) calc(calc(100vw - 48px) / 2), 100vw" srcset="https://images.unsplash.com/photo-1523768817242-39ab4249a6d5?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=14e85dfb408586029279636308bca290&auto=format&fit=crop&w=100&q=60 100w,
<img itemprop="thumbnailUrl" alt="Walt Disney Concert Hall at dusk" data-test="standard-photo-grid-multi-col-img" sizes="(min-width: 1335px) 416px, (min-width: 992px) calc(calc(100vw - 72px) / 3), (min-width: 768px) calc(calc(100vw - 48px) / 2), 100vw" srcset="https://images.unsplash.com/photo-1496277397776-ca8089ecc5b7?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=8788c40854a2dece7b70927c31806802&auto=format&fit=crop&w=100&q=60 100w,
这些就是我们需要的部分html代码,怎么用正则表达式从所有html源码中获取这些片段呢
chapter_photo_list=re.findall(r'<img itemprop="thumbnailUrl".*?100w,',html)
<img itemprop="thumbnailUrl".*?100w,',html)
从图中可以看出就这一句正则表达式就可以摘出这些片段下来解释解释正则表达式。
上面那句正则表达式中单引号里带下划线的就是我们要补充的,后面的html就对应的是上面的网页源代码。
这句中的 .*? 你可以理解为此处略去n个字,这句正则表达式的意思就是在html中匹配出所有以'<img itemprop=“thumbnilUrl”'开头以 '100w' 结尾的片段。
事实上现在获取到的片段有一部分是多余的,我们真正需要的只有 srcset="后面的Url 也就是上图中蓝色
的链接。
下来更改正则表达式
chapter_photo_list=re.findall(r'<img itemprop="thumbnailUrl".*?srcset="(.*?)100w,',html)
看看运行结果
成功了现在只剩下图片地址了。和之前的正则表达式比较比较有什么不同?
中间多了 srcset="(.*?) 大家需要了解的就是(.*?)它就代表获取 srcset=”与 100w之间的部分
有人会想为什么不直接写
chapter_photo_list=re.findall(r'srcset="(.*?)100w,',html)
而要写成那样?
因为这个网页源代码中不是只有图片Url的时候才有,如果你那样写会获取到好多没有的,所以前面那部
分必须有它起到了定位的作用。
在这里再展示一下以上代码
import requests #导入requests库
import re #写正则表达式要导入的
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'} #给请求指定一个请求头来模拟chrome浏览器
res = requests.get('https://unsplash.com') #像目标url地址发送get请求,返回一个response对象
print(res.text) #r.text是http response的网页HTML
res.encoding='utf-8' #把获取到的源代码格式改为utf-8,避免汉子乱码
html=res.text
chapter_photo_list=re.findall(r'<img itemprop="thumbnailUrl".*?srcset="(.*?)100w,',html)
print(chapter_photo_list)
4.创建文件夹并切换路径
os.mkdir('D:\BeautifulPicture') #创建文件夹
os.chdir('D:\BeautifulPicture') #切换路径至上面创建的文件夹
在写这两句代码之前要先导入os,就是在开头写import os 你也可以在下面的代码中看到。
5.下载图片
for chapter_photo in chapter_photo_list: #从图片列表中循环取出每一个图片网络地址
print(chapter_photo)
url=chapter_photo
name=re.findall(r'photo-(.*?)-',chapter_photo)[0] #用正则表达式在网络地址中匹配出一段作为jpg文件的命名
print(name)
img = requests.get(url)
file_name = name + '.jpg'
print('开始保存图片')
f = open(file_name, 'ab')
f.write(img.content)
print(file_name, '图片保存成功!')
f.close()
有没有发现这里的正则表达式又有不同?
这里的正则表达式后面多了一个 [0] ,这样就是为了避免它匹配符合条件的所有,[0]就是匹配到符合要求
的第一部分,[1]就是符合要求的第二部分,以此类推就像数组一样。
6.完整代码
import requests #导入requests库
import re #写正则表达式要导入的
import os
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'} #给请求指定一个请求头来模拟chrome浏览器
res = requests.get('https://unsplash.com') #像目标url地址发送get请求,返回一个response对象
print(res.text) #r.text是http response的网页HTML
res.encoding='utf-8' #把获取到的源代码格式改为utf-8,避免汉子乱码
html=res.text
chapter_photo_list=re.findall(r'<img itemprop="thumbnailUrl".*?srcset="(.*?)100w,',html)
print(chapter_photo_list)
#os.mkdir('D:\BeautifulPicture') #创建文件夹
os.chdir('D:\BeautifulPicture') #切换路径至上面创建的文件夹
for chapter_photo in chapter_photo_list:
print(chapter_photo)
url=chapter_photo
name=re.findall(r'photo-(.*?)-',chapter_photo)[0]
print(name)
img = requests.get(url)
file_name = name + '.jpg'
print('开始保存图片')
f = open(file_name, 'ab')
f.write(img.content)
print(file_name, '图片保存成功!')
f.close()
应注意创建文件夹时应注意是否存在此文件夹,如果此文件夹存在应注释掉对应语句或删除文件夹或改创
建路径。
看看运行结果
运行完你会发现只有十张图片,这是因为这个网站是下拉式的它没有页数。如果感兴趣可以继续学习怎么
用代码实现下拉动作,或找有页数的图片网下载全网图片。谢谢观看!