[問題] 請問如何了解巴哈姆特的網頁結構以抓資料

看板Python作者 (poorguy)時間5年前 (2019/05/11 10:07), 編輯推噓10(10062)
留言72則, 5人參與, 5年前最新討論串1/1
我目前正在練習用巴哈姆特的網頁抓資料 https://www.gamer.com.tw/ 但是碰到的問題是我無法理解其網頁架構 舉例來說 我想要抓Android安裝榜 所以我開chrome並使用f12去對網頁資料 然後看到https://imgur.com/a/zCehUFB 知道class是"BA-ctag1now" 接著往上看到https://imgur.com/a/rR8Fy5j 知道class是"BA-ctag1" 然後往下看到https://imgur.com/a/nniibSr 知道class是"BA-cbox BA cbox5 BA mobilegamechart 然後往下看到https://imgur.com/a/itCK19J 知道class是"game"+遊戲名稱欄位是"p" 但如果我輸入https://pastebin.com/1fMz0ZCk 結果就會失敗 請問我該如何拆解巴哈姆特的網頁架構 還是我的程式本身也有哪裡錯了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.163.182.206 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1557540452.A.2FD.html

05/11 12:09, 5年前 , 1F
有 id 幹嘛不用 id.... <div id="gamechart-hot">
05/11 12:09, 1F

05/11 12:09, 5年前 , 2F
class 的功能是為了配合 css 和 js 進行瀏覽器渲染加工
05/11 12:09, 2F

05/11 12:10, 5年前 , 3F
時的分類,所以可以預期幾乎不會是只出現一次
05/11 12:10, 3F

05/11 12:49, 5年前 , 4F
要寫爬蟲最好去了解一下 html
05/11 12:49, 4F

05/11 18:31, 5年前 , 5F
給s860134,多謝你的指點,目前已經試出以下結果
05/11 18:31, 5F

05/11 18:39, 5年前 , 6F

05/11 18:40, 5年前 , 7F
只是也如art1所說,不懂html結構的話很難進行下去
05/11 18:40, 7F

05/11 19:17, 5年前 , 8F
我現在才知道,要抓資料要同時懂程式跟網頁才行
05/11 19:17, 8F

05/11 19:59, 5年前 , 9F
因為我不斷縮小https://pastebin.com/FBTjW4w9
05/11 19:59, 9F

05/11 20:05, 5年前 , 10F
卻無法拆解出最後的部分,讓我可以拉出排行榜的遊戲名
05/11 20:05, 10F

05/11 20:07, 5年前 , 11F
附帶一題,請問id或class的名稱你們都是怎麼打的
05/11 20:07, 11F

05/11 20:08, 5年前 , 12F
我都只能一邊看網頁右邊的名稱一邊用手打字
05/11 20:08, 12F

05/11 20:09, 5年前 , 13F
沒有直接COPY貼上到程式裡頭的方法嗎
05/11 20:09, 13F

05/11 20:26, 5年前 , 14F
print(soup.select('a.hotgame > p.game'))
05/11 20:26, 14F

05/11 20:27, 5年前 , 15F
這是利用 css 選擇器來選到你要的元素,所以也要去了解一下
05/11 20:27, 15F

05/11 20:27, 5年前 , 16F
這樣才能比較有效率的抓出想要的資料
05/11 20:27, 16F

05/11 20:34, 5年前 , 17F
select 會回傳串列(list),所以串列元素的text就是你要的
05/11 20:34, 17F

05/12 00:08, 5年前 , 18F
給art1,感謝你的協助https://pastebin.com/hE2DNT3S
05/12 00:08, 18F

05/12 00:10, 5年前 , 19F
所以我猜你的程式意思是把a class="hotgame"到
05/12 00:10, 19F

05/12 00:11, 5年前 , 20F
p class="game"之間的資料以序列形式抓出來
05/12 00:11, 20F

05/12 00:13, 5年前 , 21F
只是我不明白若我想要只看最後排行榜的資料
05/12 00:13, 21F

05/12 00:13, 5年前 , 22F
為何是這種結果https://pastebin.com/AK5byWc1
05/12 00:13, 22F

05/12 00:15, 5年前 , 23F
https://pastebin.com/C1c97e8Z,我一直沒辦法只顯現
05/12 00:15, 23F

05/12 00:16, 5年前 , 24F
實際榜單的遊戲排行而去掉前後的內容
05/12 00:16, 24F

05/12 00:38, 5年前 , 25F
你要注意印出來的資料最前面跟最後面有 [ 跟 ]
05/12 00:38, 25F

05/12 00:39, 5年前 , 26F
這代表在[]裡面(也就是串列list)的元素是以逗號 , 隔開
05/12 00:39, 26F

05/12 00:40, 5年前 , 27F
串列裡面的每一個元素其實都是 bs4 建構的一種物件,包含了
05/12 00:40, 27F

05/12 00:42, 5年前 , 28F
各種資料和函式,你需要的只是串列元素的text屬性值,至於
05/12 00:42, 28F

05/12 00:44, 5年前 , 29F
排行,初步看是按照串列裏面的順序,因為神魔存在索引值 0
05/12 00:44, 29F

05/12 00:44, 5年前 , 30F
的位置
05/12 00:44, 30F

05/12 00:45, 5年前 , 31F
存取text屬性值的程式碼像這樣
05/12 00:45, 31F

05/12 00:45, 5年前 , 32F
soup.select('a.hotgame > p.game')[0].text
05/12 00:45, 32F

05/12 00:46, 5年前 , 33F
實際上不會這樣存取,而是用 for..in...迴圈來讀取
05/12 00:46, 33F

05/12 00:46, 5年前 , 34F
for item in soup.select('a.hotgame > p.game'):
05/12 00:46, 34F

05/12 00:47, 5年前 , 35F
print(item.text)
05/12 00:47, 35F

05/12 00:50, 5年前 , 36F
a.hotgame > p.game 是指只要有符合這個順序與類別名稱的
05/12 00:50, 36F

05/12 00:50, 5年前 , 37F
html 元素都抓出來
05/12 00:50, 37F

05/12 00:51, 5年前 , 38F
應該還要加上一個標籤名稱才對
05/12 00:51, 38F

05/12 00:53, 5年前 , 39F
select 應該是專門用來透過 CSS 選擇器找資料的函式
05/12 00:53, 39F

05/12 00:54, 5年前 , 40F
應該說找 html 元素才對
05/12 00:54, 40F

05/12 09:23, 5年前 , 41F
感謝art1,我嘗試的結果https://pastebin.com/6NjJc3ST
05/12 09:23, 41F

05/12 09:24, 5年前 , 42F
我原本以為是直接去把<p class="game">後的答案抓出來
05/12 09:24, 42F

05/12 09:26, 5年前 , 43F
但看來不是,而是遊戲名稱是屬於item要用for叫出來才對
05/12 09:26, 43F

05/12 09:30, 5年前 , 44F
你說的"a.hotgame > p.game 是指只要有符合這個順序
05/12 09:30, 44F

05/12 09:31, 5年前 , 45F
與類別名稱的html 元素都抓出來"是指串列裡原本有很多
05/12 09:31, 45F

05/12 09:32, 5年前 , 46F
資料,但是透過a.hotgame > p.game分離出想要的部分
05/12 09:32, 46F

05/12 09:50, 5年前 , 47F
請問是這樣嗎?
05/12 09:50, 47F

05/12 09:54, 5年前 , 48F
另外,請問你有何推薦的網頁架構或是抓資料的資源
05/12 09:54, 48F

05/12 09:55, 5年前 , 49F
這樣一來我日後要練習的話比較容易找到起點
05/12 09:55, 49F

05/12 09:57, 5年前 , 50F
搞不懂自己錯在哪裡也搞不懂自己對在哪裡真的很頭痛
05/12 09:57, 50F

05/12 10:57, 5年前 , 51F
對,因為 soup 就是用來存 html 解析之後得到的資料
05/12 10:57, 51F

05/12 10:59, 5年前 , 52F
我一開始寫爬蟲時對 html 跟 python 都不太了解,也是像你這
05/12 10:59, 52F

05/12 10:59, 5年前 , 53F
樣一層一層找下去,但這種方式太痛苦了
05/12 10:59, 53F

05/12 11:00, 5年前 , 54F
後來學了 html 之後,就比較知道要怎麼快速取出已解析的html
05/12 11:00, 54F

05/12 11:01, 5年前 , 55F
元素
05/12 11:01, 55F

05/12 11:02, 5年前 , 56F
在學的時候是連 CSS、JavaScript一起學,實際用 JavaScript
05/12 11:02, 56F

05/12 11:02, 5年前 , 57F
透過 CSS 選擇器去操作各種 html 元素
05/12 11:02, 57F

05/12 11:03, 5年前 , 58F
所以之後就了解到 bs4 已經幫我們把 html 元素都解出來了
05/12 11:03, 58F

05/12 11:04, 5年前 , 59F
只要知道存在哪些對應的位置,並學會取出的語法就好
05/12 11:04, 59F

05/12 11:05, 5年前 , 60F
如果不懂 CSS 選擇器的話,用找字串的方式去處理比較沒效率
05/12 11:05, 60F

05/12 11:10, 5年前 , 61F
看別人寫爬蟲都是練習爬一些把資料整合呈現的網站,例如電影
05/12 11:10, 61F

05/12 11:10, 5年前 , 62F
相關、拍賣相關、股票相關之類的
05/12 11:10, 62F

05/12 13:39, 5年前 , 63F
給art1,我還是第一次聽說CSS選擇器,請問這是軟體嗎
05/12 13:39, 63F

05/12 13:39, 5年前 , 64F
請問你都推薦哪種?或是哪種網頁你比較推薦我去瞭解
05/12 13:39, 64F

05/12 13:58, 5年前 , 65F
我以後要抓網頁的話,也是需要有一個好的起點,不然
05/12 13:58, 65F

05/12 13:58, 5年前 , 66F
我這樣瞎猜也不是辦法,還是要對網頁架構有足夠瞭解
05/12 13:58, 66F

05/12 15:41, 5年前 , 67F
developer.mozilla.org/zh-TW/docs/Glossary/CSS_Selector
05/12 15:41, 67F

05/12 15:41, 5年前 , 68F
前面自行加上https://
05/12 15:41, 68F

05/12 18:02, 5年前 , 69F
多謝,原來mozilla就有資料,我只知道FIREFOX而已
05/12 18:02, 69F

05/12 21:41, 5年前 , 70F
google比別人給要來的更好
05/12 21:41, 70F

05/13 21:33, 5年前 , 71F
右鍵 編輯html
05/13 21:33, 71F

05/13 21:33, 5年前 , 72F
這樣就能複製了
05/13 21:33, 72F
文章代碼(AID): #1SrYvaBz (Python)
文章代碼(AID): #1SrYvaBz (Python)