原帖:向日葵智能
现在基于python的爬虫实战项目,网络上的资料还是非常多的,但是本节介绍的爬虫略有不同:同样的是下载某个网页的美女图片,不同的是我们这里利用人工智能筛选出漂亮的。爬虫咱们慢慢说,筛选的原理很简单,参考 python实战小项目,人脸检测,让电脑对你的颜值打分 小节。
网络爬虫也叫网络蜘蛛(spider),它的官方定义可以去百科查,这里咱们只通俗的说什么是网络爬虫,可能不准确,但是相对更好理解,还是举例说明。
有时候,你可能从某个网页上看到一段信息,觉得非常符合口味,于是动手把它存下来了。这个读取并且存储数据的过程,和一次网络爬虫爬取是类似的。百度,谷歌等搜索引擎,相信大家都用过,它是怎么实现搜索功能的呢?
其实全靠爬虫。他们的网络爬虫不停的爬取互联网的信息并且把认为有用的存下来,当用户输入关键词搜索时,百度谷歌把关键词和自己的数据库匹配,把最相关的网页展示给用户,这样就完成了一次搜索。
咱们再设想一个场景:有一天,你可能看到某个网站上很多信息都很好,一个一个网页的打开并且存储真是麻烦死了。那么这个时候就可以借助网络爬虫,甚至把整个网站的信息都爬取下来。这也是爬虫的一个用途。
经过上面的解释,可以知道,网络爬虫的行为和咱们使用浏览器的行为很像。那么,这里介绍的python网络爬虫其实就是模拟浏览器的。
上图是一组图片,如果咱们想把这些图片都保存下来,一张一张的保存实在太费事了。好像有迅雷可以下载全部链接,但是它会把不该下载的也下载下来,比如红框圈中的那个怪男。
右键,查看网页源代码:
得到很多很多字符,咱们只关心图片链接,打开上图红框圈中的链接,得到图片如下:
显然图片的链接在网页的源代码中,那么怎么写这个python实战项目,网络爬虫呢?
实际上就是模拟浏览器请求那个图片网页的网址。不多说,直接看源码,很简单
#coding:utf-8
import requests
# url 即为图片网页的网址
url = "https://image.baidu.com/search/index?tn=baiduimage&【...】"
data = requests.get(url)
print data.content
运行后,会发现刚才咱们在浏览器查看的源代码被打印出来了。
怎么从一大堆字符里提取出关键的美女图片链接呢?答案是使用正则表达式,关于正则表达式,可以参考:
使用正则表达式的第一步是找出链接的规律,它在哪些位置出现。这里粗略的试一下:
注意到链接是存在 “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 网络爬虫脚本,发现我们成功了,得到了一系列的图片地址:
得到了图片的链接后,咱们怎么把它们存下来呢?答案就是,再模拟浏览器访问一次图片链接,然后把获得的数据写到文件即可。咱们直接上代码:
#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脚本,得到
成功了!
可以看到,虽然图片被爬取下来了,但并不是完美的,因为怪男也被下载下来了。怎么筛选呢?实际上,可以参考我们前面的博客:
只下载 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 人工智能爬虫
— 选择性的爬取图片。