网页爬虫抓取百度图片(Python一分钟带你探秘不为人知的网络昆虫!(上))
优采云 发布时间: 2021-11-15 04:22网页爬虫抓取百度图片(Python一分钟带你探秘不为人知的网络昆虫!(上))
内容
你好!大家好,我是一只正在努力赚钱买生发乳液的小灰猿。很多学过Python的朋友都希望有一个属于自己的爬虫,所以今天大灰狼给小伙伴们分享一个简单的爬虫程序。
请允许我在这里卖给我的朋友。
什么是网络爬虫?
所谓网络爬虫,简单来说就是通过程序打开特定的网页,抓取网页上存在的某些信息。想象一下,如果把一个网页比作一块田地,爬虫就住在这个田地里,从田地头爬到田头,只捕食田地里吃某种食物的昆虫。哈哈,比喻有点粗糙,但网络爬虫的实际效果是类似的。
想要了解更多的朋友也可以阅读我的文章《Python带你一分钟探秘网络昆虫!》!
爬虫的原理是什么?
那么有朋友可能会问,爬虫程序是怎么工作的呢?
举个栗子:
我们看到的所有网页都是由特定的代码组成的,这些代码涵盖了这个网页中的所有信息。当我们打开某个网页时,按F12键可以看到该网页的代码,我们以百度图片搜索皮卡丘网页为例,按F12后,可以看到如下代码,覆盖了整个网页的所有内容。
以一个爬取“皮卡丘图片”的爬虫为例。我们的爬虫想要爬取这个网页上所有的皮卡丘图片,所以我们的爬虫要做的就是在这个网页的代码中找到皮卡丘图片的链接,在这个链接下添加下载图片。
所以爬虫的工作原理就是从网页的代码中寻找并提取特定的代码。这就像从一个很长的字符串中找到一个特定格式的字符串。对这块知识感兴趣的人也可以。阅读我的文章文章《实战中Python特定文本提取,挑战高效办公的第一步》,
了解了以上两点之后,就是如何编写这样的爬虫了。
Python爬虫常用的第三方模块有urllib2和requests。大灰狼个人认为urllib2模块比requests模块复杂,所以这里我们以requests模块为例编写爬虫程序。
以抓取百度皮卡丘图片为例。
根据爬虫的原理,我们的爬虫程序要做的是:
获取百度图片中“皮卡丘图片”的网页链接 获取该网页的所有代码 在代码中找到图片的链接 根据图片链接编写通用正则表达式,匹配所有符合要求的图片链接代码通过设置的正则表达式一一打开图片链接下载图片
接下来,大灰狼就按照以上步骤和大家分享一下这个爬虫的准备过程:
1、获取百度图片中“皮卡丘图片”的网页链接
首先我们打开百度图片的网页链接
然后在关键字搜索“皮卡丘”后打开链接
%E7%9A%AE%E5%8D%A1%E4%B8%98
通过对比,去掉多余的部分后,我们可以得到百度图片关键词搜索的一般链接长度如下:Keyword
现在我们第一步是在百度图片中获取“皮卡丘图片”的网页链接,下一步就是获取网页的所有代码
2、获取本页所有代码
这时候我们可以先使用requests模块下的get()函数打开链接
然后通过模块中的text函数获取网页的文字,也就是所有的代码。
url = "http://image.baidu.com/search/index?tn=baiduimage&word=皮卡丘"
urls = requests.get(url) #打开链接
urltext = urls.text #获取链接文本
3、在代码中找到图片的链接
这一步我们可以先打开网页的链接,按F12按照大灰狼开头提到的方法查看网页的所有代码,然后如果我们要抓取jpg中的所有图片格式,我们可以按Ctrl+F找到具体内容的代码,
比如我们在网页的代码中找到带有jpg的代码,然后找到类似下图的代码,
链接就是我们想要获取的内容。我们通过仔细观察这些链接会发现这些链接之间的相似之处,即每个链接之前都会有“OpjURL”:以提示,最后以“,”结尾
我们取出了其中一个链接
访问后发现图片也可以打开。
所以我们可以暂时推断一下,百度图片中jpg图片的一般格式为“"OpjURL":XXXX"",
4、 根据图片链接写一个通用的正则表达式
既然知道了这类图片的一般格式是""OpjURL":XXXX"",那么下一步就是按照这个格式写正则表达式了。
urlre = re.compile('"objURL":"(.*?)"', re.S)
# 其中re.S的作用是让正则表达式中的“.”可以匹配所有的“\n”换行符。
不熟悉正则表达式使用的朋友也可以阅读我的两篇文章文章《Python教程中的正则表达式(基础)》和《Python教程中的正则表达式(改进版)》
5、 通过设置的正则表达式匹配代码中所有符合要求的图片链接
上面我们已经写好了图片链接的正则表达式,接下来就是通过正则表达式匹配所有的代码,得到所有链接的列表
urllist = re.findall(urltext)
#获取到图片链接的列表,其中的urltext为整个页面的全部代码,
接下来,我们用几行代码来验证我们通过表达式匹配的图片链接,并将所有匹配的链接写入txt文件:
with open("1.txt", "w") as txt:
for i in urllist:
txt.write(i + "\n")
之后我们就可以在这个文件下看到匹配的图片链接了,复制一张就可以打开了。
6、一一打开图片链接,下载图片
现在我们已经存储了列表中所有图片的链接,下一步就是下载图片。
基本思路是:通过for循环遍历列表中的所有链接,以二进制方式打开链接,新建一个.jpg文件,将我们的图片以二进制形式写入文件中。
这里为了避免下载太快,我们每次下载前都会休眠三秒,每个链接的访问时间最长为5秒。如果访问时间超过五秒,我们判断下载失败,继续下载下一章图片。
至于为什么要打开图片并以二进制方式写入,是因为我们的图片需要经过二进制方式解析后才能被计算机写入。
下载图片的代码如下,下载次数设置为3:
i = 0
for urlimg in urllist:
time.sleep(3) # 程序休眠三秒
img = requests.get(urlimg, timeout = 5).content # 以二进制形式打开图片链接
if img:
with open(str(i) + ".jpg", "wb") as imgs: # 新建一个jpg文件,以二进制写入
print("正在下载第%s张图片 %s" % (str(i+1), urlimg))
imgs.write(img) #将图片写入
i += 1
if i == 3: #为了避免无限下载,在这里设定下载图片为3张
break
else:
print("下载失败!")
现在,一个简单的爬取百度皮卡丘图片的爬虫就完成了,朋友们也可以随意更改图片关键词和下载次数,培养一个属于自己的爬虫。
最后附上完整的源码:
import requests
import re
import time
url = "http://image.baidu.com/search/index?tn=baiduimage&word=皮卡丘"
urls = requests.get(url) # 打开链接
urltext = urls.text # 获取链接全部文本
urlre = re.compile('"objURL":"(.*?)"', re.S) # 书写正则表达式
urllist = urlre.findall(urltext) # 通过正则进行匹配
with open("1.txt", "w") as txt: # 将匹配到的链接写入文件
for i in urllist:
txt.write(i + "\n")
i = 0
# 循环遍历列表并下载图片
for urlimg in urllist:
time.sleep(3) # 程序休眠三秒
img = requests.get(urlimg, timeout = 5).content # 以二进制形式打开图片链接
if img:
with open(str(i) + ".jpg", "wb") as imgs: # 新建一个jpg文件,以二进制写入
print("正在下载第%s张图片 %s" % (str(i+1), urlimg))
imgs.write(img) #将图片写入
i += 1
if i == 3: #为了避免无限下载,在这里设定下载图片为3张
break
else:
print("下载失败!")
print("下载完毕!")
如果觉得有用,记得点赞关注哦!