python爬女神_没有忍住,还是用Python爬了N多个女神
学 Python,从爬女神开始
啥也不说,今天是来送福利的
女神大会
不是知道有多少人知道“懂球帝”这个 APP(网站),又有多少人关注过它的一个栏目“女神大会”,在这里,没有足球,只有女神哦。
画风是这样的
女神评分,全部是由球迷来决定,是不是很赤鸡,下面就一起来看看球迷眼中女神排名吧。
开工
获取 ID 信息
首先,我们可以通过抓取懂球帝 APP 的网络请求,拿到一个 API,
http://api.dongqiudi.com/search?keywords=type=all&page=
该 API ,我们能够拿到如下信息
我们主要关注 ID 和 thumb,ID 后面用来拼接女神所在页面的 HTML 地址,thumb 就用来收藏。
于是,我们就可以得到一个简单的解析函数
def get_list(page):
nvshen_id_list = []
nvshen_id_picture = []
for i in range(1, page):
print("获取第" + str(i) + "页数据")
url = 'http://api.dongqiudi.com/search?keywords=%E5%A5%B3%E7%A5%9E%E5%A4%A7%E4%BC%9A&type=all&page=' + str(i)
html = requests.get(url=url).text
news = json.loads(html)['news']
if len(news) == 0:
print("没有更多啦")
break
nvshen_id = [k['id'] for k in news]
nvshen_id_list = nvshen_id_list + nvshen_id
nvshen_id_picture = nvshen_id_picture + [{k['id']: k['thumb']} for k in news]
time.sleep(1)
return nvshen_id_list, nvshen_id_picture
下载 HTML 页面
接下来,通过观察,我们能够得到,每个女神所在的页面地址都是这样的,
https://www.dongqiudi.com/archive/**.html
其中 ** 就是上面拿到的 ID 值,那么获取 HTML 页面的代码也就有了
def download_page(nvshen_id_list):
for i in nvshen_id_list:
print("正在下载ID为" + i + "的HTML网页")
url = 'https://www.dongqiudi.com/archive/%s.html' % i
download = DownloadPage()
html = download.getHtml(url)
download.saveHtml(i, html)
time.sleep(2)
class DownloadPage(object):
def getHtml(self, url):
html = requests.get(url=url).content
return html
def saveHtml(self, file_name, file_content):
with open('html_page/' + file_name + '.html', 'wb') as f:
f.write(file_content)防止访问限制,每次请求都做了2秒的等待
但是,问题来了
当我直接请求这个页面的时候,竟然是这样的
被(悲)拒(剧)了
没办法,继续斗争。重新分析,发现请求中有携带一个 cookie,哈哈,这个我们已经轻车熟路啦
对 requests 请求增加 cookie,同时再把 headers 里面增加个 User-Agent,再试
成了!
解析本地 HTML
最后,就是解析下载到本地的 HTML 页面了,页面的规则就是,本期女神介绍页面,会公布上期女神的综合得分,而我们的主要任务就是获取各个女神的得分
def deal_loaclfile(nvshen_id_picture):
files = os.listdir('html_page/')
nvshen_list = []
special_page = []
for f in files:
if f[-4:] == 'html' and not f.startswith('~'):
htmlfile = open('html_page/' + f, 'r', encoding='utf-8').read()
content = BeautifulSoup(htmlfile, 'html.parser')
try:
tmp_list = []
nvshen_name = content.find(text=re.compile("上一期女神"))
if nvshen_name is None:
continue
nvshen_name_new = re.findall(r"女神(.+?),", nvshen_name)
nvshen_count = re.findall(r"超过(.+?)人", nvshen_name)
tmp_list.append(''.join(nvshen_name_new))
tmp_list.append(''.join(nvshen_count))
tmp_list.append(f[:-4])
tmp_score = content.find_all('span', attrs={'style': "color:#ff0000"})
tmp_score = list(filter(None, [k.string for k in tmp_score]))
if '.' in tmp_score[0]:
if len(tmp_score[0]) > 3:
tmp_list.append(''.join(list(filter(str.isdigit, tmp_score[0].strip()))))
nvshen_list = nvshen_list + get_picture(content, tmp_list, nvshen_id_picture)
else:
tmp_list.append(tmp_score[0])
nvshen_list = nvshen_list + get_picture(content, tmp_list, nvshen_id_picture)
elif len(tmp_score) > 1:
if '.' in tmp_score[1]:
if len(tmp_score[1]) > 3:
tmp_list.append(''.join(list(filter(str.isdigit, tmp_score[1].strip()))))
nvshen_list = nvshen_list + get_picture(content, tmp_list, nvshen_id_picture)
else:
tmp_list.append(tmp_score[1])
nvshen_list = nvshen_list + get_picture(content, tmp_list, nvshen_id_picture)
else:
special_page.append(f)
print("拿不到score的HTML:", f)
else:
special_page.append(f)
print("拿不到score的HTML:", f)
except:
print("解析出错的HTML:", f)
raise
return nvshen_list, special_page
def get_picture(c, t_list, n_id_p):
print("进入get_picture函数:")
nvshen_l = []
tmp_prev_id = c.find_all('a', attrs={"target": "_self"})
for j in tmp_prev_id:
if '期' in j.string:
href_list = j['href'].split('/')
tmp_id = re.findall(r"\d+\.?\d*", href_list[-1])
if len(tmp_id) == 1:
prev_nvshen_id = tmp_id[0]
t_list.append(prev_nvshen_id)
for n in n_id_p:
for k, v in n.items():
if k == prev_nvshen_id:
t_list.append(v)
print("t_list", t_list)
nvshen_l.append(t_list)
print("get_picture函数结束")
return nvshen_l
保存数据
对于我们最后解析出来的数据,我们直接保存到 csv 文件中,如果数据量比较大的话,还可以考虑保存到 mongodb 中。
def save_to_file(nvshen_list, filename):
with open(filename + '.csv', 'w', encoding='utf-8') as output:
output.write('name,count,score,weight_score,page_id,picture\n')
for row in nvshen_list:
try:
weight = int(''.join(list(filter(str.isdigit, row[1])))) / 1000
weight_2 = float(row[2]) + float('%.2f' % weight)
weight_score = float('%.2f' % weight_2)
rowcsv = '{},{},{},{},{},{}'.format(row[0], row[1], row[3], weight_score, row[4], row[5])
output.write(rowcsv)
output.write('\n')
except:
raise对于女神的得分,又根据打分的人数,做了个加权分数
保存图片
def save_pic(url, nick_name):
resp = requests.get(url)
if not os.path.exists('picture'):
os.mkdir('picture')
if resp.status_code == 200:
with open('picture' + f'/{nick_name}.jpg', 'wb') as f:
f.write(resp.content)直接从拿到的 thumb 地址中下载图片,并保存到本地。
做一些图
首先我们先做一个柱状图,看看排名前10和倒数前10的情况
可以看到,朱茵、石川恋和高圆圆位列三甲,而得分高达95+的女神也有7位之多。那么排名后10位的呢,自行看吧,有没有人感到有点扎心呢,哈哈哈。同时,也能够从打分的人数来看出,人气高的女神,普遍得分也不低哦。
不过,该排名目前只代表球迷心目中的榜单,不知道程序猿心中的榜单会是怎样的呢
词云
图片墙
流口水哦。
百度 API 评分
百度有免费的人脸检测 API,只要输入图片,就能够得到对应的人脸得分,还是非常方便的,感兴趣的小伙伴可以去官网看看哦。
我这里直接给出了我通过百度 API 得出的女神新得分,一起来看看吧
哈哈哈哈,AI 的评分,对于图片的依赖太高,纯属娱乐。
代码地址:
python爬女神_没有忍住,还是用Python爬了N多个女神相关推荐
- Python灰帽子_黑客与逆向工程师的Python编程之道
收藏自用 链接:Python灰帽子_黑客与逆向工程师的Python编程之道
- python爬女神_终于我还是没忍住,用Python爬了一波女神
你学爬虫,最终不还是为了爬妹子 125537qvvcq0jz6h7zv7s2.jpg (10.63 KB, 下载次数: 0) 2019-11-27 12:55 上传啥也不说,开始福利赠送~女神大会不是 ...
- 终于我还是没忍住,用Python爬了一波女神
你学爬虫,最终不还是为了爬妹子 啥也不说,开始福利赠送~ 女神大会 不是知道有多少人知道"懂球帝"这个 APP(网站),又有多少人关注过它的一个栏目"女神大会" ...
- python 完全面向对象_史上最全的Python面向对象知识点疏理
原标题:史上最全的Python面向对象知识点疏理 面向对象技术简介 类: 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例.class 类变量:类变 ...
- python 面试问题_值得阅读的30个Python面试问题
python 面试问题 Interview questions are quite tricky to predict. In most cases, even peoples with great ...
- python房地产爬虫_房产中介网站爬虫实战(Python BS4+多线程)(一)
本系列文章介绍了爬取链家和搜房网(房天下)数据的方法. 房产中介网站爬虫实战(Python BS4+多线程)(一) 房产中介网站爬虫实战(Python BS4+多线程)(二) 房地产市场向来是大数据分 ...
- python 路径格式化_吐血整理!140种Python标准库、第三方库和外部工具都有了!...
导读: Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具. 这些库可用于文件读写.网络抓取和解析.数据 ...
- python图像计数_计算机视觉:利用OpenCV和Python进行车辆计数详细步骤
本教程我将分享几个简单步骤解释如何使用OpenCV进行Python对象计数. 需要安装一些软件: Python 3 OpennCV 1.了解Opencv从摄像头获得视频的Python脚本import ...
- python手机教程_一张图带你学会Python,学习Python的非常简单,附教程
不过这张图是基于 Python 2 的(虽然影响也很小),所以我做了几个注释,也就是图上的几个数字,对内容做一点点补充说明: 关于编码,并不是一定要 UTF-8,而是要求"一致", ...
最新文章
- python yield与递归
- python web为什么不火-pythonweb为什么不火-问答-阿里云开发者社区-阿里云
- html5中有哪些新属性,整理HTML5中表单的常用属性及新属性
- python中plot是什么意思_python中的plot函数是什么?
- Java多态的实现方式,实战篇
- WebLogic—发布Web项目
- linux ssh 双机互信
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_07-freemarker基础-if指令
- Python+Tensorflow+CNN实现车牌识别
- java写一个音乐播放程序,同时显示歌词
- c语言 从文件中读取车牌,输入一个车牌号写入文件,找出所有后四位是一个完全平方数的车牌号并输出
- speedoffice(Excel)表格如何添加边框?
- Mac OS 源码 截屏工具
- 特立独行的幸福(25分)Python
- vsphere client下载地址
- 最简单DIY基于ESP32CAM的物联网相机系统⑥(用上位机VS2013 MFC实现WIFI图传)
- 精美黑色UI版创客新零售系统源码
- 分销小程序功能有哪些?如何使用分销小程序实现裂变卖货?
- 动物大全和动物识别系统毕业设计,动物大全和动物AI识别系统设计与实现,动物识别系统论文毕设作品参考
- 【图片】笔记图片资源