Python 網路爬蟲 Web Crawler 教學 - AJAX / XHR 網站技術分析實務 By 彭彭
ฝัง
- เผยแพร่เมื่อ 5 ก.พ. 2025
- 喜歡彭彭的教學影片嗎?點擊「加入」按紐取得更多會員服務哦。
加入會員: / @cwpeng-course
建議先學習基本的網路爬蟲程式,請參考另外一份影片:
• Python 網路爬蟲 Web Crawle...
0. 最終目標:抓取 Medium.COM 網站的文章列表資料
1. 什麼是 AJAX 技術
1.1 網頁前端 JavaScript 的技術
1.2 網頁載入後持續和伺服器互動的技術
2. 分析網站運作模式
2.1 仔細觀察網站資料的載入時間點
2.2 檢查原始碼是否包含網站資料
3. 找到正確的資料網址
3.1 利用 Chrome 的開發人員工具
3.2 利用 Network 工具觀察 AJAX / XHR 的運作
3.3 找出資料來源網址,觀察資料格式
4. 實務操作
4.1 觀察 medium.com 的網站運作
4.2 找到 medium.com 的首頁文章標題資料網址
4.3 利用爬蟲程式,連線抓取
-------------------
更多學習資訊,請到彭彭的課程網站:
training.pada-...
感謝 老師認真教導,希望最後轉職成功!
還有謝謝老師分享那麼多細節及技巧!
未來轉職成功在回饋彭彭老師
最後祝大家都轉職成功😇😇😇
祝福你順利轉職成功哦,期待你的回報和後續消息 :)
淺顯易懂,原來ajax這樣抓(network/xhr),神教學👍👍
謝謝哪 :) 很高興對你有幫助哦 👍👍
看完第21集啦,感謝老師教學,能學到新知識感覺很快樂
快樂很重要!
謝謝彭彭老師,真的很佛心的教學系列。
謝謝你的回饋和支持,繼續努力 :)
老師加油 !!! 看你的影片真的受益良多
幫助到很多剛學習的人
老師的影片真的很棒
謝謝你特地來和我說加油 :) 覺得開心 ~~~~
彭彭跟你說件事, 今天打算爬學校的英語學習網站的題目, 本以為題目的答案都放在數據庫, 誰知一看HTML, 全部答案都放在一個Javascript的列表, 之後簡單看了下細節就找到管理員入口了😂
哈哈哈哈,很棒耶,感覺有駭客的 Fu 😂😂
上次只有看到前一片基礎入門,結果爬不了含js的網站,我要爬的網站我找了很久找不到規律,後來用Selenium的webdriver, 還滿好用的。
感謝你的分享,Selenium 是模擬完整瀏覽器運作的工具,確實是挺方便的沒錯 :)
使用kkdays的購票網頁練習的同學,因為資料是list,可以改成
import json
data=json.loads(data)
posts=data["data"]
for key in posts:
print(key["name"])
其實老師在16課抓台北市政府資料的單元有教,謝謝老師的指導~
感謝你的分享,相信對其他人會很有幫助 :)
顯示錯誤欸
TypeError: string indices must be integers
@@stevenlai4772 posts = data["data"]["top_products"]["prod_list"] posts那邊要這樣打,單打["data"]的話會出現你那個錯誤
期待這邊有後續新的影片QQ,剛好在做爬網站資料的專案...再麻煩老師了
一直都會有新的影片哦 :)
今天使用老師的教學,仍然可以抓到資料,謝謝彭彭老師!
感謝你的回饋 :)
可以借參考嗎!謝謝你!
謝謝老師!!燃起我寫爬漫畫的衝動!
哈哈哈!!希望你爬漫畫順利 XDDDD
網站改版了XD 感謝彭彭老師! 繼續學下去就對了!
對哦,網站改版了 XDDD 不過還是可以學習一些觀念哦 :)
@@cwpeng-course 真的,超級感謝澎澎老師!
我用KKDAY練習
後面如果跟著打post=posts[KEY]
結果會出現list indices must be integers or slices, not dict
後來直接拿掉此行
改為print(key["name"])結果標題就跑出來了
但是我還是不懂為什麼...
我也遇到聽樣的狀況QQ
卡 遇到相同問題
跟你分享我的程式和觀察,程式跑得出來但不確定是不是正確的觀念,也想再麻煩老師有空可以幫忙解惑!
------------(程式內容)-------------------
# 1*抓取 kkday.com 某主題頁的文章資料 (AJAX / XHR)
import urllib.request as req
url="www.kkday.com/zh-tw/product/ajax_productlist/?country=&city=&keyword=&availstartdate=&availenddate=&cat=TAG_3_7&time=&glang=&sort=omdesc&page=1&row=10&fprice=*&eprice=*&precurrency=TWD&csrf_token_name=e655f49b36fe7a1f84bc98f37cfd2ad4"
# 建立一個 Request 物件,附加 Request Headers 的資訊
request=req.Request(url,headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
})
with req.urlopen(request) as response:
data=response.read().decode("utf-8") # 根據觀察,取得的資料是 JSON 格式
# 2*解析 JSON 格式的資料,取得每篇文章標題
import json
data=json.loads(data) # 把原始的 JSON 資料解析成字典/列表的表示形式
# 取得 JSON 資料中的文章標題
posts=data["data"]
for key in posts:
print(key["name"])
# 老師的講解中: 在 Post 中的資料要再往裡一層才有 title
# kkday 的 data 資料則直接為 9 比內涵 name 的資料,其實沒有"0"-"9"的字典的鍵(這邊我也不知道為什麼分成0-9)
# 老師的爬蟲內容:
# Post
# 5a9b57
# acceptedAt:0
# allowresponses:true
# ...
# title: "23 insanely useful NodeJs Libraries you should know in 2020" 這邊
# ...
# 6c7469
# 6f6bdb
# ...
# kkday的爬蟲內容:
# data
# id:119566
# prod_oid:119566
# name:宜蘭星寶蔥體驗農場 | 三星蔥派 & 蔥油餅 & 手工饅頭 | 全台配送 這邊
# ...
------------(程式內容)-------------------
能夠執行的程式就沒問題。
主要是要分析取得的結果,每個網站都不一樣。如果是字典,就用字典的方式取得,類似 dic["name"]。如果是列表就要用迴圈來逐一取得。
請問你用的也是ajax_get_homepage_setting的連線網址嗎?我用它但會出現http_error
老師您好,時至今日medium網站以更新了不少,我在開發人員工具中找到的是Fetch/XHR,裡面並沒有home-feed,更沒有post之類的東西可以找到標題,但是照著老師的程式碼,還是能爬到舊資料,想問一下網站以更新了,為什麼還能爬到資料呢?
可能是對方網站雖然用了新的後端,但還留著原來的後端接口,沒有實際移除也不一定。
感謝發問,也想問這題
可以借參考嗎!謝謝你!
現在不給抓取了:(
可以參考下一部最新的爬蟲教學哦 ~
老師您好,想請問如果沒有看到home feed的部分,還有可能出現在哪裡?我每項都點了但沒有看到類似的。
在graphql的下面找到了~
看起來是改了設計,真是太不巧惹 QQ
我簡單講一下,第一要使用 Post Method,第二要附上連線資訊最後面的 Payload 資料,第三至少要附上 Request Header 中的 Content-Type 設定。
不會很簡單,哀哀哀哀,可能要另外錄一份影片來介紹 ~
@@cwpeng-course 老師有預計甚麼時候上影片嗎XD (敲碗等待中
@@Chrischen1011 如果是說這部影片的更新的話,可能要再等等哦,因為很多已經排定的事項要處理,過一個月之後吧 XDDD
@@cwpeng-course 谢谢老师!非常感谢你的讲解
@彭彭的課程
請問老師,如果是那種會員制論壇,甚至是FB、IG(等需要登入才能夠檢視內容的網站)
應該朝怎麼樣的方向思考去撰寫code呢?
或是有什麼關鍵字可以搜尋,供後續繼續研究?
你得學習完整的網站後端開發和資料庫領域 ~
Medium改版後無法使用,我改用kkdays抓title
結果我要設定cookie的拼圖驗證碼在重新登入後被封鎖😂
感謝
這篇解說很詳細
可以了解很多解析的細節
謝謝你的回饋,很高興對你有幫助 :)
程式新手發問:
請問在json格式讀取資料的時候
為什麼在檔案的那篇youtube語法是:json.load()
在這篇爬蟲的語法是:json.loads()
兩個在使用上有什麼差異嗎?
json.load(檔案物件或是回應物件)
json.loads(字串)
他們接收的參數型態不同。
@@cwpeng-course 謝謝說明😃
感謝彭彭老師!講解得很清楚
不會,也謝謝你的回饋 :)
想請問我在抓kkday首頁標題的時候,出現"HTTP Error 403: HTTP Forbidden" 怎麼辦,我有加headers,是伪裝得還不夠像嗎?
我也有遇到同樣的問題
我也是QQ
我沒有真的抓過,估計是偽裝的不夠像,可以把開發人員工具中觀察到的所有 headers 都加進去看看。
@@cwpeng-course
老師請問在添加完全部的headers後return以下error是代表什麼意思以及有什麼解決辦法呢:
http.client.RemoteDisconnected: Remote end closed connection without response
請問有解決了嗎
請問老師: Python 網路爬蟲, 什麼情況下: 用 SELENIUM ? 什麼情況下: 用 BS4 ? 優點各如何?
bs4 比較底層,會比較有效率。不過 selenium 會更容易理解和操作,也比較容易突破一些比較難爬取的網頁。
@@cwpeng-course 謝謝🙏
Medium
雖然開發人員工具內看不到home-feed
但是request url 還是可以寫進程式抓資料
給各位參考
感謝你的分享,看來他還沒把舊的 API 拿掉 XDDD
想請教您程式碼是如何寫的!,還有想詢問您 API是如何找到的?
@@yinchen7380 HI 我只是參照老師的教學,把舊的API網址貼上(現在網站找不到home-feed, 拿到的也是舊的資料)
把爬出來的data放入pandas再存成csv檔 , 可以方便觀察Json data,資後就照老師的教學分析data
參考如下
data=data.replace("])}while(1);","")
data=json.loads(data) # 把原始的JSON 資料解析成字典/列表的表示形式
print(data)
df=pd.DataFrame(data)
df.to_csv("test_data.csv")
觀察csv檔的內容就跟老師在Chrome觀察的是一樣的
首先非常感謝 林Sir 的回覆!!! 我自己有兩個疑惑:
1. 你在輸入 api 還是用老師的這段 "medium.com/_/api/home-feed" 嗎?
2. 找到資料後,不是還是無法看到標題~等等嗎? 還是你只是想表達可以抓資料而已😅
不好意思,我有點亂亂的
請問老師 kkday 裡面 preview 呈現 name: "桃園青埔|Xpark 都會型水生公園門票" 跟影片裡面Medium的 title 呈現形式一樣 為什麼 kkday 就是列表 而 Medium 是字典
看他外面一層的符號是 [] 還是 {}
@@cwpeng-course 我有觀察到 kkday 的形式是這樣
prod_list: [{id: 101517, prod_oid: 101517, name: "桃園青埔|Xpark 都會型水生公園門票",…},…]
所以是因為他最外面那層是 [ ] 列表的關係 如果是 { } 就是字典了
應當是這樣理解, 感謝老師
老師,為什麼這裡用的是json.loads(data)而不是json.load(data)呢?
前面的影片教json的時候用的是後者
json.loads() 要給的是字串型態的資料,json.load() 要給的是一種特殊可以被讀取的物件,例如 response。這樣的差別,稍有不同但概念上是一樣的。
老師您好
想請問一下,BeautifulSoup是不是只能解析.html 結尾的網站?
我看到有些網址的結尾是.aspx
這個和 html 有什麼不同呢?
BeautifulSoup 可以解析 HTML 文件,就算網址結尾是 .aspx 抓取之後的文件格式通常依然還是 HTML,這個牽扯到一些網站後端開發的知識,如果你有興趣深入可以往那個領域去找找答案。
@@cwpeng-course 好的了解
26:04
老師加的 那串用來replace 的 字串
data = data.replace("])}while(1);","")
感謝分享 :)
請問除了kkday之外,還有什麽比較適合練習d額XHR網站?
第一次開kkday的後台,結果沒注意到驗證的拼拼圖而被封鎖了😫
彭彭老師您好:
剛剛看完這部影片真的獲益良多!
看完後我想要利用蝦皮的網站進行練習,想要抓取首頁上的"每日新發現",在抓出JSON格式後,往字典內的商品名稱尋找,卻發現在最後抓取出來的字典被list給包住,因此無法用key的方式抓取,請問遇到這樣的情況是要尋找將list轉換為dict的函式嗎?
謝謝老師!
卡個 我也遇到這個問題
List 就要先用迴圈取出 List 內部的資料,或者按照基礎 List 的語法直接用中括號加編號取得列表中的資料。
@@cwpeng-course 謝謝彭彭老師!
講解的很詳細,感謝老師
謝謝你的回饋呦 :))))
老濕感謝您,
大軍準備進入 Medium :D
哈哈哈哈,沒這麼誇張哪,我相信 Medium 肯定沒問題的 XDDDD
謝謝老師的教學, 想請教老師影片裡迴圈中的key是自訂變數嗎?還是是根據網站的內容寫出來的 這裡觀念一直卡住!
自定義的變數 ~
老師您好,
有可以練習這個方法的網站嗎? 好像 medium 已經不適合練習了 XD 謝謝
可以考慮看看蝦皮的網站,我一開始是想用蝦皮當例子的 XDDDD
@@cwpeng-course 蝦皮好像也找不到...(是我眼矬嗎QQ)但是kkday可以,感謝網友分享~
@@ok8426888 可以請教您kkday的解法嗎>
@@qwe850324
建議先找到主程式的XHR(有時候找的頭痛)
我的寫法是這樣(基本上是跟著彭彭老師說的做):
#甚麼是AJAX? 一種JavaScript技術 (在chrome裡面的開發人員中叫XHR)
import urllib.request as req
url="www.kkday.com/zh-tw/home/ajax_get_homepage_setting?csrf_token_name=6cd82dbc2a4c18355b683320d4c9012f"
request=req.Request(url,headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"
})
with req.urlopen(request) as response:
Data=response.read().decode("utf-8") #根據觀察,取得的資料是json模式
#解析JSON格式資料,取得每篇文章標題
import json
Data=json.loads(Data) #把原始資料解析成字典/列表的表示形式
#取得JSON資料中的文章標題列表
posts=Data["data"]["homepage_product_group"]
for key in posts:
print(key['title'])
其中最後的這段:
posts=Data["data"]["homepage_product_group"]
for key in posts:
print(key['title'])
我也嘗試過用老師影片裏面的打法
for key in posts:
post=posts[key]
print(post["title"])
但是會出現錯誤
TypeError: list indices must be integers or slices, not dict
後來我才發現因為medium.com網站裡面的title有多一層包著所以才需要像老師一樣做(即意:程式隨機碼不是在最後而是倒數第二個)不過這也是我的想法、自己解釋的方式,希望有幫到你。
剛剛突然發現如果改成這樣可以抓到top10的活動標題:
posts=Data["data"]["top_products"]["prod_list"]
for key in posts:
print(key["name"])
你可以隨便玩玩看XD
更加詳細的內容或你有遇到甚麼問題可能還是要問專業的人。畢竟我也還學不到一個月,一起加油吧(欸嘿>_O!)
@@ok8426888 感謝你的分享,參考你的內文資訊我也成功了!
請問一下彭彭老師,我今天看這個學習視頻,去medium網站(現在好像頁面有點不一樣了),我按照視頻裡的操作,但沒有找到home-feed,不知道是不是網站有改,還是我哪裡弄錯了??
網站確實有可能有變動,爬蟲程式必須隨著網站的變動而變動,所以建議要抓住網站分析的方式,然後隨機應變。
講解非常的詳細!很喜歡你的影片!之前試著爬Bloomberg,但是發現問題很多還是爬取不了,可以請教嗎?
每個網站的爬取方式都會不太一樣,我們學習爬蟲必須學習他的核心分析和運作方式,才有機會去推到不同網站。有些很難有些比較簡單,我可能無法幫你針對特定網站做協助哦 ~
看完老師的教學發現medium更改了規則?所以自己寫了一個,我個人沒接觸過python也不是本科,大概花了5hr研究,
repl.it/@Steven04090/BonyBulkyPipelining
建議真的想不出來,再點進來互相研究,我寫得非常陽春。
老師的教學邏輯很清楚,重點就是模仿人、模仿瀏覽器的行為,相信大家花點時間也可以完成。
下面提供一些關鍵字:
Request Method:POST
Request Payload
python for迴圈的寫法(dict,int 之類的差別)
2020/10/14寫的,也許之後規則又修改,此篇就沒用啦
讚讚,謝謝你的分享,看起來好像是改了,真是太不巧惹 QQ
早上趁著工作空檔,看了一下瀑布區的規則,就把它更新。
為避免有人點進來直接run太多筆,只寫到前30筆,也沒給user input,
瀑布區也有給limit限制,最高到每次25筆,過多會顯示400 error。
可能沒給cookie的關係,瀑布區滿容易重複主題的
真的要感謝老師~
最詳細最適合新手理解的課程!
但老師我想問
pip install bs4是成功的,但是要使用時卻跑出找不到這個模組bs4
請問是什麼原因呢?
不會呦,謝謝 :)
安裝的指令是:pip install beautifulsoup4
pip3 install beautifulsoup4
想問一下彭彭老師 visual stuido可以顯示變數視窗嗎?可以像r studio右側那樣嗎?
我自己沒有在使用,所以不確定,不好意思 @@ 不過網路上有人在分享如何在 Visual Studio Code 中安裝變數視窗的擴充套件和使用方式,可以分享給你看看:
www.learncodewithmike.com/2019/11/python2-visual-studio-code-python.html
老師我想請問一下我輸入
for key in posts:
homepage_product_group=posts[key]
print(homepage_product_group["title"])
結果卻顯示
File "/Users/khan/Google 雲端硬碟/自學/Python Practice/python_practice/21_crawler_ajax.py", line 17, in
homepage_product_group=posts[key]
TypeError: list indices must be integers or slices, not dict
是哪邊有問題?謝謝老師!
posts 是一個列表,要使用迴圈來一一取得列表中的每一個項目
老師請教, 我完成後發生這個問題 {'Message': 'Authentication ticket was not provided.'} 這要怎麼處裡呢?
注意一下細節是否都有處理好嘍,不然要看看程式碼才有辦法進一步判斷 ~
請問老師傳統/AJAX兩者差別在哪
是需求不同,所以設計網頁要用不同方式嗎
會對使用者的體驗造成一些差異,實際上每個網站會根據自己的需求去選擇。
使用 AJAX 製作的網頁,使用者比較不會有明顯的跳頁感,會比較連貫 ~
老師您好,剛剛在邊看邊做的過程中發現XHR已經 更改成fetch/XHR 以及進入後他的下層name的位置也有複數個一模一樣的名字,這樣是否會造成資料沒辦法順序讀取以,謝謝老師
XHR 或是 fecth/XHR 在技術上是指同一件事情,所以沒有差別,Name 看起來有複數個,其實每個都不會完全一樣。概念上依然是要找到我們真正想要的資料在哪一個 Request 中,然後直接連過去抓取。
@@cwpeng-course 謝謝老師的回覆 但我還是有一部分的問題,因為現在的網頁已經沒有所謂的老師講的客製化的寫法,所以我直接省略掉了replace 概念上應該是沒問題的,取而代之的是她在某一個中間某一層(items)就開始有迴圈(0~9)因此我寫了下面的方式 卻沒辦法登入
#解析JSON格式的資料, 取得每篇文章的標題
import json
data=json.loads(data) #把原始的JSON資料解析成字典/列表的表現形式
#取得JSON資料中的標題
posts=data["[{,…}]"]["0"]["data"]["staffPicksFeed"]["items"]
for key in posts:
post=posts[key]
print(post["key"]["post"]["title"])
我最後一樣式想取得title但是抵達title前還有post層,但資料卻跑出錯誤代碼
HTTP 403 Forbidden
顯示我並沒有權限訪問該網頁,請問我該如何解決呢
再次感謝老師花費時間回答我 謝謝您
老師謝謝您 我已經看完下一篇了 我理解了 感謝老師
方便告訴我你怎麼寫的嗎 medium網頁現在裡面的東西跟影片裡的不一樣了
請問為什麼可以用data=(data["Installs"]).str.replace("[,+]","")同時替換 , 和+
但為什麼不能用data=(data["Installs"]).str.replace("[,+Free]",""),同時替換掉 , + 和Free呢?
最終寫法是data["Installs"]=pd.to_numeric(data["Installs"].str.replace(",+","").replace("Free",""))
str.replace和replace用法上有什麼差異呢?
懇請老師指教QQ
爬文還是不太懂
[,+] 這個語法其實叫做正規表達式,他有一定的規則,其實挺複雜的,所以簡單講就是 [,+Free] 按照正規表達式的規則來看,不會是你期待的那個效果。原因不是在程式的部份,你的解法其實也很好,有解決問題就很棒 :)
老师你的教学很好 对我有很大的帮助 谢谢你
祝老师 新年快乐!万事如意!心想事成!年年有余!大吉大利!
虎年行大运 hua 啊!heng 啊!ong啊!hua啊!
哈哈哈,好可爱的表情符号,新年快乐哪 :)))))
請問為什麼我network裡的XHR的連線只有三個,在preview裡也找不到跟影片中類似的資料
線上的網站經常都會持續的更新,所以有變化是正常的。爬蟲學到核心概念之後,就必須按照每個網站當時的狀況去觀察和找出關鍵點來操作。
老師請問出現 list indices must be integers or slices, not dict的結果要怎麼解決呢?卡關了>
可能要看看你的程式碼才有辦法進一步判斷哦 ~
import urllib.request as req
url="www.kkday.com/zh-tw/home/ajax_get_homepage_setting?csrf_token_name=fc5478e2309b0c53f7da0b9d4198596b"
a12=req.Request(url,headers={"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"
})
with req.urlopen(a12)as d1:
data=d1.read().decode("utf-8")
import json
data=json.loads(data)
titles=data["data"]["homepage_product_group"]
for key in titles:
post=titles[key]
print(post["title"])
找不到問題出在哪?
等我買新筆電開始學程式語言 就加入會員!
謝謝呦,希望能對你有幫助 :)
想請問一下老師,因為檔案是json格式的,那如果我要爬多一點頁數,還要載入bs4嗎? 因為頁數是html格式
不用哦。你需要仔細觀察當他載入新的文章時,背後呼叫的網址是什麼,然後用同樣的手法去取得資訊。
@@cwpeng-course 好的,謝謝老師
老師不好意思我用的網站是kkday,但是出現錯誤,
post=posts[key]
TypeError: list indices must be integers or slices, not dict
這是為甚麼呢??
不同的網站抓到的資料是不同的,所以你得根據抓到的資料去判斷程式該怎麼寫,沒有一定的作法。錯誤訊息指的是你的 posts 是一個列表,要用處理列表的方式,例如迴圈來取得資料。
謝謝老師的教學!我最近在嘗試寫爬蟲,有遇到個問題想請教您~我在selenium控制的網頁中點chrome devtool後回傳一大串跑不完的data出來。然而我前一天執行同樣的程式碼卻沒這個問題,請問這可能是什麼原因呢?會是devtool本身的錯誤嗎?
光是這些資訊我完全幫不上忙哦,很難判斷發生了什麼事情,不好意思 ~
好的 我再想想如何解決>< 謝謝老師!
網路爬蟲 Web Crawler 教學 - 這個章節很精彩
謝謝你,希望對大家都有幫助 :)
太棒了,最近卡關,感謝你
加油,希望對你有幫助 :)
彭彭老師您好,我是以蘋果日報的網站練習爬蟲,我能從XHR 中找到URL,但URL每隔一段時間會改變,有沒有方法能不手動複製網址?
你必須去分析網站中的 JavaScript 程式,找到他改變的規則,通常可以找到但不一定很好找,會是個困難的任務。
老師 可以多講些 爬蟲與其它的網頁結構 像第二集 第三集這些 ,又有些不一樣的網頁如何爬 如spa 也很類似xhr, 還有其他的網頁結構...... ,還有一些比較少見的框架 製作的網頁結構 老師也可以分析一下 如typescript ...... 等
謝謝
感謝你的建議哦,有時間我會安排的 :)
老師請問
我要爬的網站
在data=response.read().decode('utf-8')這行時
出現utf-8' codec can't decode byte 0xd0 in position 219: invalid continuation byte這個問題
網路上查發現是解碼格式的問題
請問有其他解碼格式或解決方法嗎?
你要確認你爬的網站使用的編碼是什麼,把 utf-8 替換成網站的編碼,例如 big5 這樣 ~
@@cwpeng-course 網路上有人說可以用gzip.decompress寫
import gzip
with req.urlopen(request) as response:
data= gzip.decompress(response.read())
這樣寫好像就沒問題了,請問這是什麼原因?
老師您好,我想問一下,像youtube這種是屬於哪種格式?因為我用傳統的方式爬youtube某一個人的訂閱數出來都是none
TH-cam 的訂閱數資料直接寫在程式碼中,不太好處理,建議直接使用 Google 官方的 TH-cam Data API 串接會更好 ~
請問一下我為什麼已經打的跟老師一樣了(6:50那樣)
但是還是出現urllib.error.HTTPError: HTTP Error 403: Forbidden,前兩集我也是如此。
(我以為是現在不行以前可以這樣,但是看了這集才發現應該是我自己的問題。)
要確認一下你的程式碼才比較能判斷哦 ~~~~
我也是顯示Forbidden誒
感謝彭彭大神
不會,希望對你有幫助 :)
請問一下VS CODE右邊的圖示 是甚麼軟體? 我看在右下角的工具列中也有出現. 3Q
OBS ~
for key in posts:
post=posts[key]
print(post["title"]) 和
for post in posts:
print(post["title"])
有什麼不同?
我們的 posts 若是字典的形式,for 後面的變數會取得字典的 key,無論是否取名為 key 都是,所以後面的寫法是無法運作的。
老師你好,我在網頁中開F12找network,按下XHR,只顯示圖表,沒有老師講課的內容,請問我是關掉什麼或是開啟了什麼嗎?
建議再仔細找找看,沒有畫面我也很難知道狀況 ~
感谢彭彭老师~
不会 :)
請問老師,如果被網頁封鎖是否有對應方法可以解鎖教學呢?
for key in posts:
post=posts[key]
print(post["name"])
請問為何結果如下???
File "d:\python train\網路爬蟲AJAX&XHR 網站.py", line 24, in
post=posts[key]
TypeError: list indices must be integers or slices, not dict
posts 是一個列表,要使用迴圈去取得列表中的每個項目。
謝謝教學!
請問老師有打算教GraphQL嗎?
不客氣呦 :) 目前沒有,或許過陣子他又更紅了我就會教了 XDDDDD
老師加油!!! 希望您能多發一點影片
好哦,我會繼續加油的 :)
老師,我想問一下,我主要想學習數據分析和網絡爬蟲,有什麼書推薦嗎?
我自己大概有十年不看書學習了,主要都從網路上的資源,所以可能沒辦法推薦書籍哦 @@a
老師 我的network的XHR好像找不到跟您一樣的東西噎 是不是過了那麼久已經跟以前不一樣了
網站和瀏覽器都會持續更新,抓到核心概念可能最重要 ~
老師求教! 同樣爬kkday都遇上卡關:TypeError: list indices must be integers or slices, not str
下面老師有留言因為kkday是用list來回傳信息, 但是我不太懂怎樣分別列表和字典, 也不懂對應list來修改我的程式, 下面是我本身寫的:
import json
datas=json.loads(datas)
posts=datas["data"]["top_products"]["prod_list"]
for keys in posts:
post=posts(keys)
print(post["introduction"])
而且後來我改成:
for keys in posts:
post=posts(keys)
print(post)
便出了: TypeError: 'list' object is not callable
你可以試試看 posts[keys]
太强了👍
谢谢 :)
老師教得很好 good
謝謝回饋,希望對你有幫助 :)
老師您好,用了您的方法嘗試爬了dcard,明明程式能跑也有抓到資料,但是抓到的資料不完整,只有文章ID,跟reaponse的內容不一樣,好奇為甚麼會這樣呢?我對response內的文字按右鍵選open in new tab 就是我程式抓到的東西了。
原因很多,無法一概而論,只能仔細的去確認 Dcard 的網站結構該如何處理才能抓到想要的東西 ~
想請問老師,要如何把json印出變成csv或excel,因為目前就只是在cmd上顯示爬的資料而已~
謝謝
可能不是三言兩語能講完的,但你可以找找 Python 關於 csv 和 excel 輸出的套件嘍 ~
謝謝老師的教學,由於medium網站不能使用這個方法了,於是照著留言的方法,我用了kkday當作自己練習的對象,寫到後面發現kkday的標題不是post,而是在data下面的一串數列,例如:data[1]是第一個文章標題, data[2]是第二個文章標題....依此類推,總共有9個,於是我將語法改寫如下:
posts=data["data"]
for n in range(10):
post=posts[n]
print(post["name"])
並沒有問題,成功顯示出了文章標題!
但我有個疑問想請教一下老師,假設今天我想抓取的頁面不只一個,且每個頁面的文章數量都不相等,可能第一頁有9個,第二頁有15個.....,如果遇到這種情況該怎麼修改語法會比較合適呢?
很想知道答案 感激不盡!
通常類似這樣處理:
for post in posts:
print(post)
就能簡單的把列表中的資料一一取出來了。
@@cwpeng-course 謝謝老師!
請問你用的也是ajax_get_homepage_setting的連線網址嗎?我用它但會出現http for bidden
@@湯晴羽 我也出現相同的問題,網路上有人說多用幾個header就可以了
我用了以下這幾個就沒有出錯了"User-Agent", "Accept", "Accept-Encoding" ,"Accept-Language" ,"Sec-Ch-Ua-Platform" , "Sec-Fetch-Dest"
我有找到現在在其中一個graphql裡,有post可以看到標題,但是用課程教的去爬會出現HTTP Error 403: Forbidden
要確認每個細節 ~ 可以多試試看嘍 ~
請問一下老師,AJAX的網站要怎麼做到換頁的功能,我自己是手動換頁,觀察他的數字變化才做到換頁,但我想知道有沒有其他辦法
找到網站背後資料換頁的機制,用程式去把你手動的部份自動化,概念上是這樣,實務上很看情況。
請問最後一段不能用
for key in posts:
print(key[title])
表示嗎
不行哦 ~
我跟著老師用到最後步驟時,跑出這個: list indices must be integers or slices, not dict;請問我要怎麼處理?
+1
得確認是否真的有抓到資料,如果有的話,要進一步看看你的程式碼和詳細的錯誤訊息才有辦法判斷 ~
請問老師,medium的網站技術是否有修改,我在F12內找不到HOME-FEED....
可以再仔細找找看,不一定叫做 HOME-FEED,可能已經是別的名字,但總之找到包含真實資料的連線。
可否請彭彭老師教學一下股市分析軟體?
欸,我自己本身不太玩股票,可能有點難 XDDDD
我現在的medium網頁是長這樣[{..............
}]看起來也不是json,用replace沒用,不知道要怎麼抓,懇請老師賜教
確實已經把大量的JS改掉了
網頁總是在更新的,學習的時候學關鍵的概念,實際上爬蟲程式都是要一直配合網頁調整更新 ~
練習一下kkday,發現列表裡面還有大括弧,大括弧裡還有中括弧,頂多只能抓到大標題,文章的小標題沒辦法抓。
看起來是很多層的字典和列表組成,應該還是有機會可以繼續往下抓的。
@@cwpeng-course 謝謝彭彭老師~但因為初學我還是先放棄了XD" 本來以為{}要用json去解,但看到之後pandas的影片才認出那是字典...
彭彭出新片囉~~~
嘿壓,繼續努力中 ~~~~~
我有用kkday實作出來 有需要code練習的可以跟我說 貼了兩次都不見了不知道為甚麼= =
可以借參考嗎!謝謝你!
我也需要,麻煩你了!
可以借參考嗎!謝謝你!
感謝分享 :)
可以也借參考嗎!謝謝你!
来学习咯
好哦好哦 ~
彭彭老師好, 進入Chrome裡的開發者工具->點Fetch/XHR->Refresh後, Name欄位下 找不到Home-Feed
Medium 的網站已經改版過了,你可以參考下一部教學 ~
@@cwpeng-course 謝謝
又有個網站的流量要被彭彭老師帶起來了😏
啊 @@ 應該沒有這麼誇張哪 XDDDD
老師您好,請問會上載網路爬蟲後的資料到 DATA FRAME 嗎?
有可能,如果你需要這麼做的話。但必須先想清楚你要的資料格式,整理成符合 DataFrame 的規矩。
这个讲得很好呀. 宝藏
谢谢哪 :))
老師可以分享一下python的託管網站嗎?
Heroku 或者是更加專業的雲端服務例如 AWS 上的相關服務都可以託管 Python 的程式 ~
老師您好,
請問如果我找到的資料網址有好幾個怎麼辦?
因為是動態網站
一直往下拉就一直出現文章
就必須一個一個去做連線,並取得對應的資料哦 ~ 或你仔細觀察資料網址,通常是有規律的 ~
彭彭的課程 好的 謝謝老師
我在我需要的網頁上面爬不到資料,
我直接進入網頁發現和我在開發人員工具中看到不同
拿到一句信息寫「An access token is required」, 我是需要如何得到?
每個網頁都不同,要各別分析的 ~
非常感謝老師QQ
不會呦,有幫助就好 :)))
請問彭彭老師 MEDIUM網站是不是變回傳統網站了? 我在原始碼都能找到他的標籤
我剛剛看了一下,確實可以直接從原始碼取得沒錯,應該是有改版了。
@@cwpeng-course 想請問彭彭老師我在爬蟲的時候遇到一個一直沒辦法解決的問題 在medium的網站 我在XHR沒辦法找到頁面標題存放的地方 我之前有找到一次是graphql 的文件 但是他只出現那一次 之後怎麼重新整理都找不到… 希望彭彭老師可以回答我的問題 非常感謝🙏
@@cwpeng-course 那請問這個影片還適用嗎
@@justinwu483 觀念都是適用的,但實際的網站若有變化,那就不能照抄,要按照基本觀念去做出相對的改變 ~
@@cwpeng-course 謝謝老師
谢谢老师。
不客气呦 :)
json.load 和json.loads有分別嗎?
有哦,前面是 load 輸入串流,後面是 load 字串
老師會教unity嗎?
估計一兩年內都不會呦 ~
可以請問一下老師程式最後幾行的key是指什麼呢?
使用 for 迴圈去逐一取得字典結構中的 key 值,再去對應每個 value 這樣的概念哦 ~
@@cwpeng-course 了解,謝謝老師。
老師好
請問要如何排除列表裡的資料格式問題?
我使用KKday的網站做這次的ajax練習,爬的是首頁不同活動的標題,程式碼如下:
import json
data= json.loads(data) # 把原始的 JSON 格式的資料解析成字典/列表的表示形式
# 取得 JSON 資料中的標題
posts=data["data"]["homepage_product_group"]
for key in posts:
post=posts[key]
print(post["title"])
語法看起來是沒有問題的,但結果顯示
TypeError: list indices must be integers or slices, not str
我猜是因為它的標題,有一些除了文字以外特別的符號
懇請老師幫忙解惑,感謝~🙏
迴圈中直接寫 print(key["title"]) 即可