[问题] 请问如何了解巴哈姆特的网页结构以抓资料

楼主: alubasteve (poorguy)   2019-05-11 10:07:30
我目前正在练习用巴哈姆特的网页抓资料
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
结果就会失败
请问我该如何拆解巴哈姆特的网页架构
还是我的程式本身也有哪里错了
作者: s860134 (s860134)   2019-05-11 12:09:00
有 id 干嘛不用 id.... <div id="gamechart-hot">class 的功能是为了配合 css 和 js 进行浏览器渲染加工时的分类,所以可以预期几乎不会是只出现一次
作者: art1 (人,原来不是人)   2019-05-11 12:49:00
要写爬虫最好去了解一下 html
楼主: alubasteve (poorguy)   2019-05-11 18:31:00
给s860134,多谢你的指点,目前已经试出以下结果https://pastebin.com/J2eHfP43只是也如art1所说,不懂html结构的话很难进行下去我现在才知道,要抓资料要同时懂程式跟网页才行因为我不断缩小https://pastebin.com/FBTjW4w9却无法拆解出最后的部分,让我可以拉出排行榜的游戏名附带一题,请问id或class的名称你们都是怎么打的我都只能一边看网页右边的名称一边用手打字没有直接COPY贴上到程式里头的方法吗
作者: art1 (人,原来不是人)   2019-05-11 20:26:00
print(soup.select('a.hotgame > p.game'))这是利用 css 选择器来选到你要的元素,所以也要去了解一下这样才能比较有效率的抓出想要的资料select 会回传串行(list),所以串行元素的text就是你要的
楼主: alubasteve (poorguy)   2019-05-12 00:08:00
给art1,感谢你的协助https://pastebin.com/hE2DNT3S所以我猜你的程式意思是把a class="hotgame"到p class="game"之间的资料以序列形式抓出来只是我不明白若我想要只看最后排行榜的资料为何是这种结果https://pastebin.com/AK5byWc1https://pastebin.com/C1c97e8Z,我一直没办法只显现实际榜单的游戏排行而去掉前后的内容
作者: art1 (人,原来不是人)   2019-05-12 00:38:00
你要注意印出来的资料最前面跟最后面有 [ 跟 ]这代表在[]里面(也就是串行list)的元素是以逗号 , 隔开串行里面的每一个元素其实都是 bs4 建构的一种物件,包含了各种资料和函式,你需要的只是串行元素的text属性值,至于排行,初步看是按照串行里面的顺序,因为神魔存在索引值 0的位置存取text属性值的程式码像这样soup.select('a.hotgame > p.game')[0].text实际上不会这样存取,而是用 for..in...循环来读取for item in soup.select('a.hotgame > p.game'):print(item.text)a.hotgame > p.game 是指只要有符合这个顺序与类别名称的html 元素都抓出来应该还要加上一个标签名称才对select 应该是专门用来透过 CSS 选择器找资料的函式应该说找 html 元素才对
楼主: alubasteve (poorguy)   2019-05-12 09:23:00
感谢art1,我尝试的结果https://pastebin.com/6NjJc3ST我原本以为是直接去把<p class="game">后的答案抓出来但看来不是,而是游戏名称是属于item要用for叫出来才对你说的"a.hotgame > p.game 是指只要有符合这个顺序与类别名称的html 元素都抓出来"是指串行里原本有很多资料,但是透过a.hotgame > p.game分离出想要的部分请问是这样吗?另外,请问你有何推荐的网页架构或是抓资料的资源这样一来我日后要练习的话比较容易找到起点搞不懂自己错在哪里也搞不懂自己对在哪里真的很头痛
作者: art1 (人,原来不是人)   2019-05-12 10:57:00
对,因为 soup 就是用来存 html 解析之后得到的资料我一开始写爬虫时对 html 跟 python 都不太了解,也是像你这样一层一层找下去,但这种方式太痛苦了后来学了 html 之后,就比较知道要怎么快速取出已解析的html元素在学的时候是连 CSS、JavaScript一起学,实际用 JavaScript透过 CSS 选择器去操作各种 html 元素所以之后就了解到 bs4 已经帮我们把 html 元素都解出来了只要知道存在哪些对应的位置,并学会取出的语法就好如果不懂 CSS 选择器的话,用找字串的方式去处理比较没效率看别人写爬虫都是练习爬一些把资料整合呈现的网站,例如电影相关、拍卖相关、股票相关之类的
楼主: alubasteve (poorguy)   2019-05-12 13:39:00
给art1,我还是第一次听说CSS选择器,请问这是软件吗请问你都推荐哪种?或是哪种网页你比较推荐我去了解我以后要抓网页的话,也是需要有一个好的起点,不然我这样瞎猜也不是办法,还是要对网页架构有足够了解
作者: art1 (人,原来不是人)   2019-05-12 15:41:00
developer.mozilla.org/zh-TW/docs/Glossary/CSS_Selector前面自行加上https://
楼主: alubasteve (poorguy)   2019-05-12 18:02:00
多谢,原来mozilla就有资料,我只知道FIREFOX而已
作者: jiyu520 (不要鲫鱼我)   2019-05-12 21:41:00
google比别人给要来的更好
作者: st1009 (前端攻城师)   2019-05-13 21:33:00
右键 编辑html这样就能复制了

Links booklink

Contact Us: admin [ a t ] ucptt.com