沒有忍住,還是用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爬了“幾”個女神!簡直是神仙顏值

領取方式:轉發本文+關注 並 私信小編 “ 資料”,即可獲取啦!



分享到:


相關文章: