學 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的小白還是已經接觸了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天)
該階段是專案演練階段,我們會帶領大家通過使用之前學習過的知識開發飛機大戰這一經典遊戲,專案中分別有遊戲視窗,影象繪製,遊戲迴圈,事件監聽,精靈和精靈組以及建立敵機,建立英雄和發射子彈,碰撞檢測等模組。