python实战项目,制作网络爬虫爬取百度美女图片,人工智能筛选颜值高的保存到电脑

现在基于python的爬虫实战项目,网络上的资料还是非常多的,但是本节介绍的爬虫略有不同:同样的是下载某个网页的美女图片,不同的是我们这里利用人工智能筛选出漂亮的。爬虫咱们慢慢说,筛选的原理很简单,参考 python实战小项目,人脸检测,让电脑对你的颜值打分 小节。

什么是网络爬虫?


网络爬虫也叫网络蜘蛛(spider),它的官方定义可以去百科查,这里咱们只通俗的说什么是网络爬虫,可能不准确,但是相对更好理解,还是举例说明。

有时候,你可能从某个网页上看到一段信息,觉得非常符合口味,于是动手把它存下来了。这个读取并且存储数据的过程,和一次网络爬虫爬取是类似的。百度,谷歌等搜索引擎,相信大家都用过,它是怎么实现搜索功能的呢?

其实全靠爬虫。他们的网络爬虫不停的爬取互联网的信息并且把认为有用的存下来,当用户输入关键词搜索时,百度谷歌把关键词和自己的数据库匹配,把最相关的网页展示给用户,这样就完成了一次搜索。

咱们再设想一个场景:有一天,你可能看到某个网站上很多信息都很好,一个一个网页的打开并且存储真是麻烦死了。那么这个时候就可以借助网络爬虫,甚至把整个网站的信息都爬取下来。这也是爬虫的一个用途。

python实战项目


经过上面的解释,可以知道,网络爬虫的行为和咱们使用浏览器的行为很像。那么,这里介绍的python网络爬虫其实就是模拟浏览器的。

上图是一组图片,如果咱们想把这些图片都保存下来,一张一张的保存实在太费事了。好像有迅雷可以下载全部链接,但是它会把不该下载的也下载下来,比如红框圈中的那个怪男。

右键,查看网页源代码:

得到很多很多字符,咱们只关心图片链接,打开上图红框圈中的链接,得到图片如下:

显然图片的链接在网页的源代码中,那么怎么写这个python实战项目,网络爬虫呢?

python实战项目,网络爬虫


1. 首先获取网页的源代码

实际上就是模拟浏览器请求那个图片网页的网址。不多说,直接看源码,很简单

#coding:utf-8
import requests

# url 即为图片网页的网址
url = "https://image.baidu.com/search/index?tn=baiduimage&【...】"

data = requests.get(url)
print data.content

运行后,会发现刚才咱们在浏览器查看的源代码被打印出来了。

2. python项目实战,提取出图片链接

怎么从一大堆字符里提取出关键的美女图片链接呢?答案是使用正则表达式,关于正则表达式,可以参考:

python基础,什么是正则表达式,正则表达式的使用

使用正则表达式的第一步是找出链接的规律,它在哪些位置出现。这里粗略的试一下:

注意到链接是存在 "objURL": 和逗号(,) 之间的,那么咱们的实战项目,python网络爬虫的正则表达式代码可以如下写:

#coding:utf-8
import requests

# url 即为图片网页的网址
url = "https://image.baidu.com/search/index?tn=baiduimage&【...】"

data = requests.get(url)
#print data.content

# 正则表达式的使用,可参照上一节
pattern = re.compile(r'.*?"objURL":"(.*?)",', re.S)
result = pattern.findall(data.content)
for item in result:
    print item

运行实战项目的 python 网络爬虫脚本,发现我们成功了,得到了一系列的图片地址:

3. python实战项目,下载图片

得到了图片的链接后,咱们怎么把它们存下来呢?答案就是,再模拟浏览器访问一次图片链接,然后把获得的数据写到文件即可。咱们直接上代码:

#coding:utf-8
import requests

# url 即为图片网页的网址
url = "https://image.baidu.com/search/index?tn=baiduimage&【...】"

data = requests.get(url)
#print data.content

# 正则表达式的使用,可参照上一节
pattern = re.compile(r'.*?"objURL":"(.*?)",', re.S)
result = pattern.findall(data.content)
for item in result:
    try:
        pic = requests.get(item, timeout=2)
        fp = open("pic/%d.jpg"%i, "w+")
        fp.write(pic.content)
        fp.close()
        i = i + 1
    except Exception, e:
        pass

在执行代码前,先创建一个文件夹 pic 用来存图片,然后执行实战项目python脚本,得到

成功了!

4. python实战项目,筛选图片

可以看到,虽然图片被爬取下来了,但并不是完美的,因为怪男也被下载下来了。怎么筛选呢?实际上,可以参考我们前面的博客:

python实战小项目,人脸检测,让电脑对你的颜值打分

咱们只下载 female(女),颜值大于 55 分的,代码如下:

#coding:utf-8
import requests
import urllib2
import random
import time, re
import base64
import urllib, json
from token import GetToken


faceDetectUrl = "https://aip.baidubce.com/rest/2.0/face/v1/detect"
# 根据人脸检测的颜值打分,判断是否下载
def IfDownLoad(pic, token):
    img = base64.b64encode(pic)

    params = {"face_fields":"age,beauty,expression,faceshape,gender,glasses,landmark,race,qualities","image":img,"max_face_num":5}
    params = urllib.urlencode(params)

    request_url = faceDetectUrl + "?access_token=" + token
    request = urllib2.Request(url=request_url, data=params)
    request.add_header('Content-Type', 'application/x-www-form-urlencoded')
    response = urllib2.urlopen(request)
    content = response.read()
    if content:
        js = json.loads(content)
        for item in js['result']:
            print "age: %d, beauty: %d" % (item['age'], item['beauty'])
            if 0 == cmp('female', item['gender']):
                if (item['age']<29)and(item['beauty']>55):      # 只下载女孩,年龄小于 29,颜值大于 55分
                    return True
    return False

def DownLoad(url, i):
    fp = open("pic/%d.jpg"%i, "w+")
    fp.write(pic.content)
    fp.close()



if __name__ == "__main__":
    # 获取网页源代码
    url = "https://image.baidu.com/search/index?tn=baiduimage&【...】"
    data = requests.get(url)
    # print data.content

    # 获取链接并判断是否下载
    pattern = re.compile(r'.*?"objURL":"(.*?)",', re.S)
    result = pattern.findall(data.content)
    i = 0
    token = GetToken()
    for item in result:
        print item
        try:
            pic = requests.get(item, timeout=2)
            if(True == IfDownLoad(pic.content, token)):
                DownLoad(pic.content, i)
                i = i + 1
        except Exception, e:
            pass

运行实战项目python脚本,得到结果如下:

可以看出,怪男被剔除了,下载的基本都是颜值较高的美女图片,这样我们就完成了实战项目,python 人工智能爬虫 -- 选择性的爬取图片。

阅读更多:   Python