没有忍住,还是用Python爬了“几”个女神!简直是神仙颜值


没有忍住,还是用Python爬了“几”个女神!简直是神仙颜值

学 Python,从爬女神开始

啥也不说,今天是来送福利的

女神大会

不是知道有多少人知道“懂球帝”这个 APP(网站),又有多少人关注过它的一个栏目“女神大会”,在这里,没有足球,只有女神哦。

画风是这样的

私信小编01 或者资料获取此项目源代码以及项目思路!

没有忍住,还是用Python爬了“几”个女神!简直是神仙颜值


女神评分,全部是由球迷来决定,是不是很赤鸡,下面就一起来看看球迷眼中女神排名吧。

开工

获取 ID 信息

首先,我们可以通过抓取懂球帝 APP 的网络请求,拿到一个 API,

http://api.dongqiudi.com/search?keywords=type=all&page=

该 API ,我们能够拿到如下信息

没有忍住,还是用Python爬了“几”个女神!简直是神仙颜值


我们主要关注 ID 和 thumb,ID 后面用来拼接女神所在页面的 HTML 地址,thumb 就用来收藏。

没有忍住,还是用Python爬了“几”个女神!简直是神仙颜值


于是,我们就可以得到一个简单的解析函数

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秒的等待

但是,问题来了

当我直接请求这个页面的时候,竟然是这样的

没有忍住,还是用Python爬了“几”个女神!简直是神仙颜值


被(悲)拒(剧)了

没有忍住,还是用Python爬了“几”个女神!简直是神仙颜值


没办法,继续斗争。重新分析,发现请求中有携带一个 cookie,哈哈,这个我们已经轻车熟路啦

对 requests 请求增加 cookie,同时再把 headers 里面增加个 User-Agent,再试

没有忍住,还是用Python爬了“几”个女神!简直是神仙颜值


成了!

解析本地 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的情况

没有忍住,还是用Python爬了“几”个女神!简直是神仙颜值


可以看到,朱茵、石川恋和高圆圆位列三甲,而得分高达95+的女神也有7位之多。那么排名后10位的呢,自行看吧,有没有人感到有点扎心呢,哈哈哈。同时,也能够从打分的人数来看出,人气高的女神,普遍得分也不低哦。

不过,该排名目前只代表球迷心目中的榜单,不知道程序猿心中的榜单会是怎样的呢

没有忍住,还是用Python爬了“几”个女神!简直是神仙颜值


词云

没有忍住,还是用Python爬了“几”个女神!简直是神仙颜值


图片墙

没有忍住,还是用Python爬了“几”个女神!简直是神仙颜值


不要流口水哦

没有忍住,还是用Python爬了“几”个女神!简直是神仙颜值


百度有免费的人脸检测 API,只要输入图片,就能够得到对应的人脸得分,还是非常方便的,感兴趣的小伙伴可以去官网看看哦。

我这里直接给出了我通过百度 API 得出的女神新得分,一起来看看吧

没有忍住,还是用Python爬了“几”个女神!简直是神仙颜值


哈哈哈哈,AI 的评分,对于图片的依赖太高,纯属娱乐。

随着时代的发展越来越快,市场需求越来越大,Python的应用也越来越广泛,不论你是刚开始学习Python的小白还是已经接触了Python,我都希望这篇文章能对你们有所帮助。

这是我们专门为 小白 量身打造的Python新手教程,具有如下特点:

全视频,手把手,零起点,项目实例,基于船新的Python 版本。

Python是一种计算机程序设计语言。你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合网页编程的JavaScript语言等等。

Python是一种什么语言?

首先,我们普及一下编程语言的基础知识。编程语言就是和计算机交流的语言,目的是让计算机完成各项任务,例如打开一个视频,从网页上抓取特定的信息。不同的编程语言,完成同一个任务,编写的代码量,差距也很大。

比如,完成同一个任务,C语言要写1000行代码,Java只需要写100行,而 Python可能只要20行。

所以Python是一种 相当高级的语言。

那么用Python可以做什么?可以做日常任务,比如处理excel文档;比如在网页上抓取你需要统计的数据;可以做网站,很多著名的网站包括YouTube就是Python写的。Python是一种全栈的开发语言,所以你如果能学好Python,那么前端,后端,测试,大数据分析,爬虫等这些工作你都能胜任。

如果你是小白用户,满足以下条件:

会使用电脑,但从来没写过程序;

还记得一点点初中数学学的数学知识;

想从编程小白变成专业的程序猿;

每天能抽出半个小时学习。

不要再犹豫了,这个教程就是为你准备的!

超适合小白的python新手教程

本套教程学习时间15天

第一阶段(1-8天)

该阶段我们正式进入Python这门语言的学习,首先通过了解Python语言的起源,Python语言的设计目标,Python语言的设计哲学,Python语言的优缺点和面向对象的基本概念,以及Python语言的执行方式,还有Python集成开发环境PyCharm的使用为我们接下来的学习做铺垫。

然后我们会学习int,string,float三种简单的变量类型,变量间的计算,变量的输入输出,if判断语句,while循环语句,for循环语句,break和continue的使用,函数的基本使用,模块的使用,列表,元组,字典三种高级变量,字符串的常用操作。

最后我们会学习语法的进阶内容,全局变量,局部变量,可变数据类型和不可变数据类型以及函数返回多个值,函数的缺省参数,多值参数,递归的基本使用。

第二阶段(9-12天)

该阶段我们会学习面向对象(OOP)这一重要的编程思想,首先学习的知识点有类和对象的基本概念,dir函数,self的作用,初始化方法__init__,内置函数__str__,del,单继承,方法重写,私有属性和方法,多继承,多态,类属性,静态方法。

然后我们还会学习单例模式这一设计模式,异常的捕获,异常的抛出,from import局部导入,from import导入同名工具, from import导入所有工具,包的使用,制作模块,pip的使用以及文件的相关操作。

第三阶段(13-15天)

该阶段是项目演练阶段,我们会带领大家通过使用之前学习过的知识开发飞机大战这一经典游戏,项目中分别有游戏窗口,图像绘制,游戏循环,事件监听,精灵和精灵组以及创建敌机,创建英雄和发射子弹,碰撞检测等模块。

领取方式:转发本文+关注 并 私信小编 “ 资料 ”,即可获取啦!


没有忍住,还是用Python爬了“几”个女神!简直是神仙颜值


没有忍住,还是用Python爬了“几”个女神!简直是神仙颜值


没有忍住,还是用Python爬了“几”个女神!简直是神仙颜值

领取方式:转发本文+关注 并 私信小编 “ 资料”,即可获取啦!



分享到:


相關文章: