本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理
以下文章來源于可以叫我才哥 ,作者可以叫我才哥
1.概述
《王者榮耀》上線至今5個年頭了,作為這些年國內最熱門的手游(沒有之一),除了帶來游戲娛樂之外,我們在這五周年之際,試著從他們的官網找點樂趣,學習一下Python爬蟲的一些簡單基礎操作,
本篇將主要介紹簡單的Python爬蟲,包括網頁分析、資料請求、資料決議和資料保存,適用于基本不帶反爬的一些網站,旨在進行學習交流,請勿用作任何商業非法用途,
網頁分析其實就是打開你需要請求資料的網頁,然后「F12」看下這個網頁源資料長啥樣(如果你會web知識會更好處理,不過我沒系統學過,操作多了就熟悉一點);
資料請求我們用人見人愛的「requests」庫,關于該庫的更詳細用法大家可以去查詢該鏈接了解(https://requests.readthedocs.io/zh_CN/latest/);
資料決議一般視請求的資料格式而定,如果請求的資料是html格式,我將介紹「bs4」和「xpath」兩種方式進行決議,若請求的資料是json格式,我將介紹json和eval兩種方式進行決議;
資料保存這里分為兩種情況,如果是圖片類會用到「open」和「write」函式方法,若是文本類的我會用到pandas的「to_excel」保存為表單格式,
2.網頁分析
我們在概述說提到請求的資料會有html格式或者json格式,兩種情況下其實對應的真實請求地址是有差異的,怎么判斷呢,作為初學者我的個人經驗就是去試試,本章節兩種嘗試方案都會介紹,大家在實操中視情況而選吧!
2.1.html頁面源資料
以下面這張英雄串列頁面為例,按住“「F12」”,然后點一下開發者模式中左上角的那個有滑鼠箭頭的圖示,再在左側選取你需要的資料區域,在開發者模式區域就會出現這個資料區域的資料資訊,比如這里的“詳情頁地址”、“頭像圖片地址”和“名稱”,我們需要的也算這些資訊,所以可以直接請求該鏈接即可,
2.2.json源資料
對于局內道具串列資料,我們發現上述方案無法獲取,那么這種情況下我們可以選擇開發者模式中的「Network——>XHR」,然后重繪頁面,在name里找啊找,一般就能到了某個資料是我們需要的,
點「Preview」發現里面正是我們需要的源資料,然后在「Headers」里可以找到請求到該源資料的真實鏈接地址,這里資料請求方式為「get」,我們下一節會介紹,
3.資料請求
我們提到這里用 requests 庫進行資料請求,requests 有兩種比較常用的請求方式:post和get,剛好這里我們用的到就是get一種即可,另外請求的時候可帶很多引數,比如請求頭、cookie等等,具體大家查概述中鏈接檔案了解吧,
簡單的例子:
import requests
#英雄串列頁地址
url = 'https://pvp.qq.com/web201605/herolist.shtml'
resp = requests.get(url)
#設定解碼方式(由于請求的資料中文亂碼,這里進行解碼)
resp.encoding=resp.apparent_encoding
請求到的html源資料
import requests
#局內道具詳情頁地址
url = 'https://pvp.qq.com/web201605/js/item.json'
resp = requests.get(url)
#設定解碼方式(由于請求的資料中文亂碼,這里進行解碼)
resp.encoding=resp.apparent_encoding
局內道具json資料
4.資料決議
對于不同的源資料決議方式不同,html資料決議這里介紹兩種比較常用的入門級方式「bs4」和「xpath」,對于「json」資料其實相對來說更好處理,這里介紹兩種簡單的方式利用「json」和「eval」,
4.1.html資料決議
4.1.1.bs4
Beautiful Soup 是一個可以從HTML或XML檔案中提取資料的Python庫,它能夠通過你喜歡的轉換器實作慣用的檔案導航、查找、修改檔案的方式,
更多操作詳情大家可以去看(https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/)~
看html資料結構,我們可以找到想要的資料在「ul」節點,滿足「「下的全部」li」節點中,對于bs4來說,可以用「find_all」方法去定位,(更多解釋見代碼注釋哦)
# bs4 決議
from bs4 import BeautifulSoup
# 先將請求到的資料轉化為BeautifulSoup物件
soup = BeautifulSoup(resp.text,'html.parser')
# 定位全部的滿足 class = "herolist clearfix",由于class是關鍵字所以這里用class_
# 回傳結果只有1個的串列,因此取索引0
ul = soup.find_all('ul', class_="herolist clearfix")[0]
# 定位 ul 下面全部的 li,li中藏著我們需要的資料資訊
lis = ul.find_all('li')
# 創建一個空表用于存盤資料
herolists = []
# 遍歷全部的li
for li in lis:
# 創建空字典,用于存盤 英雄串列資訊
herolist = {}
# get_text() 獲取節點下面的文案部分
herolist['英雄名稱'] = li.get_text()
# get() 獲取 具體值,英雄詳情頁地址在 li節點的子節點a下面
herolist['英雄詳情頁'] = li.find('a').get('href')
herolist['英雄頭像'] = li.find('a').find('img').get('src')
herolists.append(herolist)
資料決議結果
4.1.2.xpath
XPath 是一門在 XML 檔案中查找資訊的語言,可用來在 XML 檔案中對元素和屬性進行遍歷,更多語法操作可以查看(https://www.w3school.com.cn/xpath/xpath_syntax.asp ),
由于本質程序上和bs4差不多,只是語法函式操作不太同,這里不做詳細介紹,直接看代碼了解下先,
# xpath 決議
from lxml import etree
html = etree.HTML(resp.text)
html_ul = html.xpath('//ul[@]')[0]
html_lis = html_ul.xpath('./li')
herolists = []
for html_li in html_lis:
herolist = {}
herolist['英雄名稱'] = html_li.xpath('./a/text()')[0]
herolist['英雄詳情頁'] = html_li.xpath('./a/@href')[0]
herolist['英雄頭像'] = html_li.xpath('./a/img/@src')[0]
herolists.append(herolist)
4.2.json資料決議
在請求的資料是json格式時,直接查看資料型別發現是str,如下:
我們可采用json.loads()和eval方法將其轉化為串列的形式,該串列和上面html資料決議后的結果格式一樣,
import json
js = resp.text
# json.loads() 處理
li = json.loads(js)
# 直接 eval() 處理
lis = eval(js)
json資料決議
5.資料保存
對于圖片類資料,請求圖片資料然后寫入本地保存;對于文本資料表單,轉化為dataframe型別存為excel檔案(需要用到pandas庫),
5.1.存盤圖片類資料
我們在英雄串列中有英雄頭像資料,這里演示將英雄頭像資料存入本地,
# 遍歷資料決議中 英雄串列
for li in herolists:
# 獲取英雄頭像網頁地址
# 如'//game.gtimg.cn/images/yxzj/img201606/heroimg/506/506.jpg'
head_url = li['英雄頭像']
# 組合 https:
url = f'https:{head_url}'
# 獲取該英雄名稱,用于賦值給圖片檔案名稱
head_name = li['英雄名稱']
# 請求圖片資料
head_data = requests.get(url)
# 設定存盤圖片的全路徑
head_path = f'保存地址'
# 打開空檔案寫入圖片資料
open(head_path, 'wb').write(head_data.content)
英雄頭像圖片資料存盤
5.2.文本資料表單存盤
import pandas as pd
# 串列轉化為dataframe型別
df = pd.DataFrame(li)
資料預覽
# 由于資料中存在一些網頁符號,作為 菜鳥的我只會用replace簡單替換
df['des1'] = df['des1'].str.replace('<br>',',').str.replace('<p>','').str.replace('</p>','')
df['des2'] = df['des2'].str.replace('<br>',',').str.replace('<p>','').str.replace('</p>','')
# 存為表格,頁簽取名為“裝備資料資訊list”
df.to_excel(r'地址',index=False,sheet_name='裝備資料資訊list')
道具文本資料表單
6.你也來玩一玩
標題中我們提到王者榮耀五周年,有102個英雄和326個皮膚,其實,在英雄串列中我們抓取的html資料中只有93個,如何獲取全部的呢?大家可以參考json資料請求的方式去找一找,如何根據相關資料的特點(比如英雄頭像地址里變動的其實是 英雄的id,英雄詳情頁也是),
大家可以看看新英雄和新皮膚,如何爬取相關資料試試,
?
https://pvp.qq.com/coming/v2/
?
6.1.英雄新皮膚數
上線五年,一共93個英雄新出過皮膚,其中貂蟬、花木蘭和孫悟空新增皮膚最多,高達5個!!
在93個英雄中,大部分只新增過1個皮膚~
6.2.新增皮膚上線時間
從上線月份來看,1月是英雄上線高峰,這個和1月大部分為春節月有關,畢竟這款產品春節也是最賺錢的,
從上線年份來看,2015年其實10月底產品才上線,所以整體新增皮膚不多,16及17年游戲高速增長期吧,團隊產能并沒有明顯提高?所以在18年之后,團隊大了,新增皮膚蹭的飛漲!
6.3.王者英雄產能
2015年10月28日王者首發時,有33個英雄,大家熟悉的亞瑟、項羽、安琪拉等都是第一批,截止到現在,5年時間內新增英雄69個,
從上線月份來看,2、8、11和1月份是新英雄出的最多的,為啥啊?
從上線年份來看,2015年上線2個月內上線7個新英雄,很快,畢竟存了很多量嘛,隨后可以看到2016年新英雄產出是高峰,隨后逐年降低的趨勢,為啥?「畢竟英雄設計是非常非常費腦袋的啊!!」
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/195943.html
標籤:Python
上一篇:Python爬蟲實戰:爬取貝殼網二手房40000條資料
下一篇:Python的本我
