网页爬虫抓取百度图片(Python一分钟带你探秘不为人知的网络昆虫!(上))

优采云 发布时间: 2022-01-10 08:15

  网页爬虫抓取百度图片(Python一分钟带你探秘不为人知的网络昆虫!(上))

  内容

  你好!大家好,我是一只为了赚钱买发水的小灰猿。很多学过Python的小伙伴都希望拥有一个属于自己的爬虫,那么今天大灰狼就给小伙伴们分享一个简单的爬虫程序。.

  请允许我在这里为我的朋友出售通行证。

  什么是网络爬虫?

  所谓网络爬虫,简单来说就是通过程序打开一个特定的网页,对网页上存在的一些信息进行爬取。想象一下,如果把一个网页比作一片田地,爬行动物就是生活在这片田地里的昆虫,从田地的头到尾爬行,只捕食田地里的某一种食物。哈哈,比喻有点粗略,但是网络爬虫的实际作用和这个差不多。

  想了解更多的朋友也可以阅读我的文章文章《Python一分钟带你探索未知的网络昆虫!》它!

  爬虫的原理是什么?

  那么有的朋友可能会问,爬虫是怎么工作的呢?

  举个栗子:

  我们看到的所有网页都是由特定的代码组成的,这些代码涵盖了网页中的所有信息。当我们打开一个网页时,按 F12 键可以查看该页面的内容。代码已准备就绪。我们以百度图片搜索皮卡丘的网页为例。按下 F12 后,可以看到下面的代码覆盖了整个网页的所有内容。

  

  以一个爬取“皮卡丘图片”的爬虫为例,我们的爬虫想要爬取这个网页上所有的皮卡丘图片,那么我们的爬虫要做的就是在这个网页的代码中找到皮卡丘图片的链接,并且从此链接下载图片。

  所以爬虫的工作原理就是从网页的代码中找到并提取特定的代码,就像从很长的字符串中找到特定格式的字符串一样,对这块知识感兴趣的朋友也可以阅读我的文章文章《Python实战中的具体文本提取,挑战高效办公的第一步》,

  了解了以上两点之后,就是如何编写这样的爬虫了。

  Python爬虫常用的第三方模块有urllib2和requests。大灰狼个人认为urllib2模块比requests模块复杂,所以这里以requests模块为例编写爬虫程序。

  以爬取百度皮卡丘图片为例。

  根据爬虫的原理,我们的爬虫程序应该做的是:

  获取百度图片中“皮卡丘图片”的网页链接 获取网页的所有代码 在代码中找到图片的链接 根据图片链接编写通用正则表达式 匹配代码中所有符合要求的图片链接通过设置的正则表达式一张一张打开图片链接下载图片

  接下来大灰狼就按照上面的步骤跟大家分享一下这个爬虫的准备工作:

  1、获取百度图片中“皮卡丘图片”的网址

  首先我们打开百度图片的网页链接

  

  然后打开关键字搜索“皮卡丘”后的链接

  %E7%9A%AE%E5%8D%A1%E4%B8%98

  

  作为对比,去掉多余部分后,我们可以得到百度图片关键词搜索的一般链接长度如下:

  现在我们的第一步是获取百度图片中“皮卡丘图片”的网页链接,下一步就是获取网页的所有代码

  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文件,将我们的图片以二进制形式写入文件中。

  这里为了避免下载太快,我们每次下载前休眠3秒,每个链接的访问时间最多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=皮卡丘"

s = requests.session()

s.headers['User-Agent']='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'

urls = s.get(url).content.decode('utf-8')

# urls = requests.get(url) # 打开链接

# requests.get(url="https://www.baidu.com/")

urltext = urls # 获取链接全部文本

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 == 5: # 为了避免无限下载,在这里设定下载图片为3张

break

else:

print("下载失败!")

print("下载完毕!")

  觉得有用的话记得点赞关注哦!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线