作者alubasteve (poorguy)
看板Python
标题[问题] 请问如何了解巴哈姆特的网页结构以抓资料
时间Sat May 11 10:07:30 2019
我目前正在练习用巴哈姆特的网页抓资料
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://webptt.com/cn.aspx?n=bbs/Python/M.1557540452.A.2FD.html
1F:→ s860134: 有 id 干嘛不用 id.... <div id="gamechart-hot"> 05/11 12:09
2F:→ s860134: class 的功能是为了配合 css 和 js 进行浏览器渲染加工 05/11 12:09
3F:→ s860134: 时的分类,所以可以预期几乎不会是只出现一次 05/11 12:10
4F:推 art1: 要写爬虫最好去了解一下 html 05/11 12:49
5F:→ alubasteve: 给s860134,多谢你的指点,目前已经试出以下结果 05/11 18:31
7F:→ alubasteve: 只是也如art1所说,不懂html结构的话很难进行下去 05/11 18:40
8F:→ alubasteve: 我现在才知道,要抓资料要同时懂程式跟网页才行 05/11 19:17
10F:→ alubasteve: 却无法拆解出最後的部分,让我可以拉出排行榜的游戏名 05/11 20:05
11F:→ alubasteve: 附带一题,请问id或class的名称你们都是怎麽打的 05/11 20:07
12F:→ alubasteve: 我都只能一边看网页右边的名称一边用手打字 05/11 20:08
13F:→ alubasteve: 没有直接COPY贴上到程式里头的方法吗 05/11 20:09
14F:推 art1: print(soup.select('a.hotgame > p.game')) 05/11 20:26
15F:→ art1: 这是利用 css 选择器来选到你要的元素,所以也要去了解一下 05/11 20:27
16F:→ art1: 这样才能比较有效率的抓出想要的资料 05/11 20:27
17F:推 art1: select 会回传串列(list),所以串列元素的text就是你要的 05/11 20:34
19F:→ alubasteve: 所以我猜你的程式意思是把a class="hotgame"到 05/12 00:10
20F:→ alubasteve: p class="game"之间的资料以序列形式抓出来 05/12 00:11
21F:→ alubasteve: 只是我不明白若我想要只看最後排行榜的资料 05/12 00:13
24F:→ alubasteve: 实际榜单的游戏排行而去掉前後的内容 05/12 00:16
25F:推 art1: 你要注意印出来的资料最前面跟最後面有 [ 跟 ] 05/12 00:38
26F:→ art1: 这代表在[]里面(也就是串列list)的元素是以逗号 , 隔开 05/12 00:39
27F:→ art1: 串列里面的每一个元素其实都是 bs4 建构的一种物件,包含了 05/12 00:40
28F:→ art1: 各种资料和函式,你需要的只是串列元素的text属性值,至於 05/12 00:42
29F:→ art1: 排行,初步看是按照串列里面的顺序,因为神魔存在索引值 0 05/12 00:44
30F:→ art1: 的位置 05/12 00:44
31F:→ art1: 存取text属性值的程式码像这样 05/12 00:45
32F:→ art1: soup.select('a.hotgame > p.game')[0].text 05/12 00:45
33F:→ art1: 实际上不会这样存取,而是用 for..in...回圈来读取 05/12 00:46
34F:→ art1: for item in soup.select('a.hotgame > p.game'): 05/12 00:46
35F:→ art1: print(item.text) 05/12 00:47
36F:推 art1: a.hotgame > p.game 是指只要有符合这个顺序与类别名称的 05/12 00:50
37F:→ art1: html 元素都抓出来 05/12 00:50
38F:→ art1: 应该还要加上一个标签名称才对 05/12 00:51
39F:→ art1: select 应该是专门用来透过 CSS 选择器找资料的函式 05/12 00:53
40F:→ art1: 应该说找 html 元素才对 05/12 00:54
42F:→ alubasteve: 我原本以为是直接去把<p class="game">後的答案抓出来 05/12 09:24
43F:→ alubasteve: 但看来不是,而是游戏名称是属於item要用for叫出来才对 05/12 09:26
44F:→ alubasteve: 你说的"a.hotgame > p.game 是指只要有符合这个顺序 05/12 09:30
45F:→ alubasteve: 与类别名称的html 元素都抓出来"是指串列里原本有很多 05/12 09:31
46F:→ alubasteve: 资料,但是透过a.hotgame > p.game分离出想要的部分 05/12 09:32
47F:→ alubasteve: 请问是这样吗? 05/12 09:50
48F:→ alubasteve: 另外,请问你有何推荐的网页架构或是抓资料的资源 05/12 09:54
49F:→ alubasteve: 这样一来我日後要练习的话比较容易找到起点 05/12 09:55
50F:→ alubasteve: 搞不懂自己错在哪里也搞不懂自己对在哪里真的很头痛 05/12 09:57
51F:推 art1: 对,因为 soup 就是用来存 html 解析之後得到的资料 05/12 10:57
52F:→ art1: 我一开始写爬虫时对 html 跟 python 都不太了解,也是像你这 05/12 10:59
53F:→ art1: 样一层一层找下去,但这种方式太痛苦了 05/12 10:59
54F:→ art1: 後来学了 html 之後,就比较知道要怎麽快速取出已解析的html 05/12 11:00
55F:→ art1: 元素 05/12 11:01
56F:→ art1: 在学的时候是连 CSS、JavaScript一起学,实际用 JavaScript 05/12 11:02
57F:→ art1: 透过 CSS 选择器去操作各种 html 元素 05/12 11:02
58F:→ art1: 所以之後就了解到 bs4 已经帮我们把 html 元素都解出来了 05/12 11:03
59F:→ art1: 只要知道存在哪些对应的位置,并学会取出的语法就好 05/12 11:04
60F:→ art1: 如果不懂 CSS 选择器的话,用找字串的方式去处理比较没效率 05/12 11:05
61F:推 art1: 看别人写爬虫都是练习爬一些把资料整合呈现的网站,例如电影 05/12 11:10
62F:→ art1: 相关、拍卖相关、股票相关之类的 05/12 11:10
63F:→ alubasteve: 给art1,我还是第一次听说CSS选择器,请问这是软体吗 05/12 13:39
64F:→ alubasteve: 请问你都推荐哪种?或是哪种网页你比较推荐我去了解 05/12 13:39
65F:→ alubasteve: 我以後要抓网页的话,也是需要有一个好的起点,不然 05/12 13:58
66F:→ alubasteve: 我这样瞎猜也不是办法,还是要对网页架构有足够了解 05/12 13:58
67F:推 art1: developer.mozilla.org/zh-TW/docs/Glossary/CSS_Selector 05/12 15:41
68F:→ art1: 前面自行加上https:// 05/12 15:41
69F:→ alubasteve: 多谢,原来mozilla就有资料,我只知道FIREFOX而已 05/12 18:02
70F:推 jiyu520: google比别人给要来的更好 05/12 21:41
71F:推 st1009: 右键 编辑html 05/13 21:33
72F:→ st1009: 这样就能复制了 05/13 21:33