9

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

 3 years ago
source link: https://blog.popkx.com/python-project-spider-download-pictures-ai-choose-beautiful-girls/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

发表于 2018-06-08 23:06:37   |   已被 访问: 755 次   |   分类于:   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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK