爬取nyist-6000张*敏*感*词*照进行微软小冰逼格剖析

优采云 发布时间: 2020-08-22 11:44

  爬取nyist-6000张*敏*感*词*照进行微软小冰逼格剖析

  Python爬取nyist-6000张*敏*感*词*照进行逼格剖析***## 前言本文章同步至我的网站:

  前几天中学要求更新档案资料库的相片,所以要求每位人去照*敏*感*词*照,大多数人是在中学上面的一个拍照的地方照的,为了容易让同学们领到合照,他们会每晚把每位人的*敏*感*词*照上传到一个网站,于是我就用爬虫爬取了6000+照片,结合微软小冰的人脸辨识中的逼格剖析功能对每张相片进行打分,然后进行一次简单的逼格剖析,下面简单说一说我的过程,结论在最后

  工具打算:

  采集照片的网址:

  微软小冰的逼格剖析网址:

  微软的图片服务器网址:

  一、爬取并保存图片

  首先,我们打开要采集照片的地址:,会见到这样:

  

  然后引入相关的库:

  import re

import requests

from bs4 import BeautifulSoup

import lxml

import os

  我们打开这种链接发觉:

  因为日期的不同,所以网页地址显得只是前面的数字,所以我们只须要找到我们要爬取的第一个页面的标号和最后一个页面的标号,然后对每一个页面分别爬取就好了。

  随便打开一个页面,会发觉图片是这样的:

  

  我们解析一下网页源代码会发觉是这样的:

  

  这些图片都无一例外的藏在img标签上面的,所以我们只须要把这种上面的内容提取下来就可以得到每一张图片的地址了。

  提取的方式有很多种,比如用BeautifulSoup,但是这儿因为这个标签并不需要解析成文档树,可以直接写一个正则表达式提取下来,所以我们可以如此写:

  /upfile/201709/\d+\.JPG

  只须要简单的匹配一下多位数字就可以了,这样我们可以写出具体代码:

  

  这样由于正则匹配的缘故,会返回一个收录所有图片地址的列表,那么如今我们要做的就是借助这个列表,进行保存:

  这个也很简单,我们遍历一下这个列表,然后构造每一个图片链接,这里也须要用正则表达式来匹配一下文件名,用requests恳求一下把二进制的东西保存成.jpg文件就好了

  

  现在我们的代码已然实现了对每位页面的图片进行保存,剩下的就是调用这两个函数了,我们只须要遍历一下要爬的网页的id,然后等着爬取完成就好了,爬虫爬完后会得到一个文件夹,里面就是你爬好的相片,就像这样:

  

  到了现今,第一步就做完了,已经拥有这几千张护照照了

  二、调用微软小冰人脸辨识中的测逼格功能

  首先,我们打开微软小冰的辨识页面:

  显示这样:

  

  这时我们点"上传图片",然后进行抓包

  

  我们发觉有两个post恳求,分别是把当前图片传到微软服务器,还有一个是进行逼格测试,进行逼格测试的时侯其中的一个参数要传入当前这个图片在微软服务器的地址,所以我们要分两步来做:

  把图片上传至微软服务器,并且得到返回的图片地址运用得到的图片地址,进行颜值颜值测试

  通过抓包可以发觉两个post地址,一个是递交图片的地址,另一个是获得逼格分数的地址:

  upload_url = 'http://kan.msxiaobing.com/Api/Image/UploadBase64'

comp_url = 'https://kan.msxiaobing.com/Api/ImageAnalyze/Process'

  我们先说第一个,通过查看抓到的包,我们会发觉每一张图片在传入服务器之前会先经过base64编码方法对图片进行编码,然后会post到谷歌的服务器,然后返回地址,那么我们就应当先对一张图片进行base64加密,然后我们会发觉返回结果是这样的:

  {'Host': 'https://mediaplatform.msxiaobing.com', 'Url': '/image/fetchimage?key=JMGsDUAgbwOliRBabKjOIkANmt-Cu2pqpAsmCZyiMDJ6wxaO8iaLjrucUw'}

  这是一段json信息,我们须要的是url上面的值,所以我们就用requests中外置的json解析器对它进行解析,所以,代码可以如此写:

  def get_img_url(file_name):

with open(file_name,'rb') as f:

img_base64=base64.b64encode(f.read())

r=requests.post(upload_url,data=img_base64)

url='https://mediaplatform.msxiaobing.com' + r.json()['Url']

return url

  我们通过把二进制信息进行编码,然后传入微软服务器,获得了这一张图片在服务器中的地址,然后在通过构造,得到完整的地址

  那么我们如今进行第二步,把信息发到微软服务器,然后得到地址,我们看一下抓的包:

  Remote Address:42.159.132.179:443

Request URL:https://kan.msxiaobing.com/Api/ImageAnalyze/Process?service=yanzhi&tid=a14a6fd556cf45c181cb116f06471450

Request Method:POST

Status Code:200 OK

Response Headers

view source

Cache-Control:no-cache

Content-Encoding:gzip

Content-Type:application/json; charset=utf-8

Date:Thu, 07 Sep 2017 17:18:28 GMT

Expires:-1

Pragma:no-cache

Server:Microsoft-IIS/8.0

Transfer-Encoding:chunked

Vary:Accept-Encoding

X-Powered-By:ASP.NET

Request Headers

view source

Accept:*/*

Accept-Encoding:gzip, deflate

Accept-Language:zh-CN,zh;q=0.8

Connection:keep-alive

Content-Length:194

Content-Type:application/x-www-form-urlencoded; charset=UTF-8

Cookie:_ga=GA1.2.1597838376.1504599720; ai_user=sp1jt|2017-09-05T10:53:04.090Z; ARRAffinity=d48a0dd61144e14e99ea10eca4fef5d81bf07933a2831679353d2761cf0db5aa; cpid=YE5cTN4wQk4hTFdMf7FVTzM0bjPlNN1MJrFATNhI10hNAA; salt=761703E5A961C3EC8AD465F2A70F639F; ai_session=pWq6U|1504804573893.97|1504804670104.895

Host:kan.msxiaobing.com

Origin:https://kan.msxiaobing.com

Referer:https://kan.msxiaobing.com/ImageGame/Portal?task=yanzhi&feid=541a6dd6cd178819892a917dd772e702

User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36

x-ms-request-id:4KL3u

x-ms-request-root-id:idMkH

X-Requested-With:XMLHttpRequest

Query String Parameters

view source

view URL encoded

service:yanzhi

tid:a14a6fd556cf45c181cb116f06471450

Form Data

view source

view URL encoded

MsgId:1504804707562

CreateTime:1504804707

Content[imageUrl]:https://mediaplatform.msxiaobing.com/image/fetchimage?key=EjJdNJc119RQMNM3GzUGslUzG3NxdRU1EnQqNFt2MVJPbiOGhpbpzmOmXA

  我们要构造data上面的信息,也就是要构造MsgId,CreateTime,Content[imageUrl]这三个信息,首先我们观察MsgId,发现它实质上就是当前的时间戳加了一个3位数的随机数,而第二个CreateTime虽然就是当前的时间戳,第三个Content[imageUrl]那当然就是我们刚才得到的图片地址了,我们就把这种参数给发起来

  然后把这种恳求发起来之后,会发觉它的返回结果是none,那么这是为什么呢,这是因为谷歌添加了cookies和refer验证,所以我们要把这两个东西置于headers上面一起给传过去,然后都会发觉它返回一段json:

  {‘msgId’: ‘4d39f92788774d65bd0261d6f4754865’, ‘timestamp’: 73, ‘receiverId’: None, ‘content’: {‘text’: ‘有潜力的姑娘!6.6分!性格肯定超好,男神最喜欢这些男孩纸咯,羡慕!’, ‘imageUrl’: ‘’, ‘metadata’: {‘AnswerFeed’: ‘FaceBeautyRanking’, ‘w’: ‘vvXoifT_gNLyhvXNhsPhjMz_pt_kbkdXisHliuToh-_uhcXkgePArM3_sN_kiuzeiuTlhvv-hMDGj_3vrPX5vsXDh_b6gv_khMr6hsjxjtvXrPHKt9XtiPfCg938jtPI’, ‘aid’: ‘303DB2A95867544E3E5EE047977CECF4’}}}

  我们依照惯例,对它进行解析,我们提取下来['content']['text']里面的内容就行了,所以这一段的代码:

  def get_score(img_url):

sys_time = int(time.time())

payload = {'service': 'yanzhi',

'tid': '7531216b61b14d208496ee52bca9a9a8'}

form = {

'MsgId': str(sys_time) + '733',

'CreateTime': sys_time,

'Content[imageUrl]': img_url,

}

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',

'Cookie': '_ga=GA1.2.1597838376.1504599720; _gid=GA1.2.1466467655.1504599720; ai_user=sp1jt|2017-09-05T10:53:04.090Z; cpid=YDLcMF5LPDFfSlQyfUkvMs9IbjQZMiQ2XTJHMVswUTFPAA; salt=EAA803807C2E9ECD7D786D3FA9516786; ARRAffinity=3dc0ec2b3434a920266e7d4652ca9f67c3f662b5a675f83cf7467278ef043663; ai_session=sQna0|1504664570638.64|1504664570638'+str(random.randint(11, 999)),

'Referer': 'https://kan.msxiaobing.com/ImageGame/Portal?task=yanzhi&feid=d89e6ce730dab7a2410c6dad803b5986'

}

r = requests.post(comp_url, params=payload, data=form, headers=headers)

print(r.json())

text = r.json()['content']['text']

return text

  这样的话,我们就可以获得小冰对这个相片的评价,那么对于后期处理,我们只要用正则表达式把其中的关于逼格分数的地方提取下来就好了,那么这时候就须要保存刚才获得的评价分数,所以我们采用的方法就是对文件重命名,就是把文件名改成:分数+原来的文件名的方式,代码如下:

  

  为了便捷我们对于程序的调试,所以用一个txt文件随时把程序的log信息传进去,就像这样:

  

  至此,打分环节也完成了,下面进行下一项

  三、把分数用图表的形式勾画下来

  这一步须要用到matplotlib库中的pyplot,用它可以勾画出好多种不同的图,先引入库:

  import matplotlib.pyplot as plt

import os

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

  由于微软小冰的API调用次数的限制,我只成功的对2118张图片进行了逼格的打分,很容易的得到了每位分数段区间的数目:

<p>def get_score():

score_num=[]

for i in range(6):

score_num.append(0)

list=os.listdir()

for name in list:

if len(name)==24:

score=float(name[:3])

if score>=3 and score=4 and score=5 and score=6 and score=7 and score=8 and score

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线