网页爬虫抓取百度图片(什么是网络爬虫?向日葵智能实战小项目)
优采云 发布时间: 2021-11-07 08:00网页爬虫抓取百度图片(什么是网络爬虫?向日葵智能实战小项目)
原帖:向日葵智能
现在基于python的爬虫实战项目,网上资料还是很多的,但是本节介绍的爬虫略有不同:同样是下载某个网页的漂亮图片,不同的是我们使用人工智能过滤掉漂亮的。. 慢慢说爬虫吧。过滤的原理很简单。参考python实战项目,人脸检测,让电脑给你的外表打分。
什么是网络爬虫?
网络爬虫也称为网络蜘蛛。它的官方定义可以在百科全书中找到。这里我们只说什么是网络爬虫,可能不准确,但相对来说比较好理解,举个例子吧。
有时,您可能会从某个网页上看到一条信息,并觉得它符合您的口味,因此您将其保存。这种读取和存储数据的过程类似于网络爬虫。百度、谷歌等搜索引擎,相信大家都用过,他们是怎么实现搜索功能的?
事实上,这一切都取决于爬虫。他们的网络爬虫不断地爬取互联网上的信息,并保存他们认为有用的信息。当用户输入关键词进行搜索时,百度谷歌将关键词与自己的数据库进行匹配,匹配最相关的网页展示给用户,从而完成一次搜索。
再设想一个场景:有一天,你可能会看到某个网站的很多信息非常好,一个个打开和存储网页真的很麻烦。那么这时候就可以使用网络爬虫爬下整个网站的信息了。这也是爬虫的一个目的。
Python实战项目
经过上面的解释,我们可以知道网络爬虫的行为和我们浏览器的行为非常相似。所以,这里介绍的python网络爬虫其实就是模拟一个浏览器。
上图是一组图片。如果我们要保存这些图片,要一一保存就太麻烦了。貌似迅雷可以下载所有的链接,但它也会下载不该下载的,比如红框里的怪人。
右键查看网页源码:
我们得到的字符很多,我们只关心图片链接,打开上图红框中的链接,得到的图片如下:
明明图片的链接在网页的源码里,那么这个python实战项目,网络爬虫怎么写呢?
Python实战项目,网络爬虫1. 先获取网页源码
其实就是模拟浏览器请求图片页面的URL。话不多说,看源码,很简单
#coding:utf-8
import requests
# url 即为图片网页的网址
url = "https://image.baidu.com/search/index?tn=baiduimage&【...】"
data = requests.get(url)
print data.content
Python
复制
运行后会发现我们刚才在浏览器中查看的源代码已经打印出来了。
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
复制
运行实战项目的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
Python
复制
执行代码前,创建一个文件夹pic存放图片,然后执行实战项目python脚本得到
这是一个成功!
4. Python实战项目,过滤图片
可以看到,虽然图片被爬下来了,但并不完美,因为怪人也被下载了。如何过滤?其实可以参考我们之前的博客:
Python实战小项目,人脸检测,让电脑给你的颜值打分。我们只下载女(女),颜值大于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']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人工智能爬虫-图片的选择性爬取。