@@阿宸-i9r 請問一下 我今天使用的時候出現這個問題IndexError: list index out of range 可是檢查了一下print(result[0]["data"]["webRecommendedFeed"]["items"][0]["post"]["title"]) 不知道哪裡錯了@@ 謝謝
print(result["data"]["topic"]["latestPosts"]["postPreviews"][0]["post"]["title"]) 這一行一直跳出 錯誤碼說: File "crawler-ajax-data.py", line 17, in print(result["data"]["topic"]["latestPosts"]["postPreviews"][0]["post"]["title"]) TypeError: list indices must be integers or slices, not str 🥲
老師您好,關於最後的程式碼部分有一些問題想要請教您~ 老師您使用的語法是for迴圈 items=result["data"]["extendedFeedItems"] for item in items: print(item["post"]["title"] 但在老師您還沒有講解這個步驟前,我有自己思考一下要怎麼打出來,最後使用while迴圈 x=0 while x
老師您好,有個問題請教 : 關於payload的數據,好像做了更新,複製後 在開頭的其中一段"variables":{"forceRank":true 在執行代碼之後 電腦分辨不出來,跳出了NameError: name 'true' is not defined. Did you mean: 'True'? 的提示 但是我改成了大寫的True之後 卻又無法從網頁中抓取到原始碼了。 請問這該如何修正呢?
@@黃柏文-v2q 我的理解跟你差不多,所以在"網路連線程式、公開資料串接"這篇教學中,台北市的公開資料網頁為json格式,所以就使用json.load即可,而在"網路爬蟲 Web Crawler 教學 - Request Data 操作實務"這篇教學中,從Medium.com上抓取的資料為"字串型式",可以用type(result)這個函示去檢查,所以需使用json.loads將其轉為"字典型式",以上是我個人的理解,如果有誤還請大家多多指教,謝謝~~
@@cwpeng-course 老師,我研究出來了,把資料存到csv的程式碼,跟大家分享如下: result=json.loads(result) with open('Medium.csv', 'w', encoding='utf-8', newline='') as f: thewriter=writer(f) header=['Title'] thewriter.writerow(header) items=result["data"]["topic"]["latestPosts"]["postPreviews"] for item in items:
彭彭老師您好,我想請教您:跟著您的步驟練習,當執行程式時遇到以下問題, Traceback (most recent call last): File "crawler-ajax-data.py", line 11, in },data=json.dumps(requestData).encode("utf-8")) NameError: name 'requestData' is not defined 如何解?
老師我遇到問題了 程式碼:(註:posts是老師改成items前的程式碼) posts=result["data"]["extendedFeedItems"] 錯誤訊息: TypeError: list indices must be integers or slices, not str 請問我該怎麼解決呢 有google過 但好像....找不太到解決方法
老師你好 請問 到17行哪裏 result=json.loads(result) items=[0]["data"]["topic"]["latestPosts"]["postPreviews"] 一直跑出錯誤碼 如下: TypeError: list indices must be integers or slices, not str 謝謝老師
老師,你好, 我只先做到印出程式碼就出問題了,回復的錯誤如下: C:\Users\user\AppData\Local\Programs\Python\Python39\python.exe: can't open file 'C:\Users\user\Desktop\python training\crawler.py': [Errno 2] No such file or directory 我重複對了好幾遍還是不知道錯在哪,希望老師可以告訴我有可能錯的地方,謝謝。
老师你好,我写了一段代码,会报出以下错误: TypeError: unbound method harry_input() must be called with HarryPython instance as first argument (got nothing instead) 代码如下: class HarryPython: def harry_print(a): print(a) def harry_input(b): input(b) def harry_ord(o): ord(o) r=HarryPython.harry_input()
感謝彭彭老師 ~ 今天實作後補充以下幾點
Request Payload 第二項 "variables":{"paging":{"from":"10","limit":10}}
from "10" 改成 0 可以從首頁第一篇文章開始擷取標題
limit "10" 改成更大的數字可以擷取更多文章標題 (太多會被拒絕)
想擷取更多可以搭配迴圈或函式
讚讚,很棒的分享,感謝 ~
太感謝了,我還想說是不是要分好幾個 graphql 去抓
感謝分享~
謝謝老師因為網站更新,教我們更多的知識! 而且講解淺顯易懂,受益良多
不會,謝謝你的回饋 :)
感謝老師
2023/11/28日
Medium網站要列印出的資訊如下:
print(result["data"]["staffPicksFeed"]["items"][0]["post"]["title"])
分享給大家
2023/12/25
我是要改成
print(result[0]["data"]["staffPicksFeed"]["items"][0]["post"]["title"])
才能正常運作耶
不過我有發現,requestData 那邊,我抓到的資料的開頭是 [ 而不是老師影片中的 {
我不確定是不是這裡沒有做修改
@@阿宸-i9r 我看原始碼也認為print(result[0]["data"]["staffPicksFeed"]["items"][0]["post"]["title"])才對,可是我用上面的print(result["data"]["staffPicksFeed"]["items"][0]["post"]["title"])才顯示正常,用您說的那樣會報錯
@@陳冠穎-b5q +1 被第一個[0]誤導好久😐😐
感謝分享 :)
@@阿宸-i9r 請問一下 我今天使用的時候出現這個問題IndexError: list index out of range 可是檢查了一下print(result[0]["data"]["webRecommendedFeed"]["items"][0]["post"]["title"]) 不知道哪裡錯了@@ 謝謝
老師您好,有兩個問題請教:
1. 有沒有辦法用函式或模組判斷網站是一般html寫法還是AJAX技術?
2. 請問爬取大量(上百個)不同網站時,有沒有一般性的辦法對付AJAX網頁?
謝謝老師的回覆~
卡一個,好棒的問題。
1. 就我所知沒有簡單直接的自動化辦法,這是很困難的問題。
2. 同上,可以補充的是 Google 正在這件事情上努力,有些成果但也沒有百分百完美。
1. 有個chrome擴充套件叫quick javascript switcher,可以將網頁的javascript屏蔽以測試你要爬取的目標資料是否受到AJAX所影響。這個chrome擴充套件你可以試試看。出自 "PyhonXChatGPT高效率工作術" 一書
2. 問問ChatGPT可能有答案
關於爬蟲的深刻體悟:
程式強不強是一回事,但觀察力是一定要有的...(可能還要有良好的視力🧐
總算找到title在哪兒~藏得有夠深R
謝謝彭彭老師
同意,感謝分享體悟 XDDDD
感謝老師的教學!!
這部影片的教學,本來我失敗了好多次(各種東西都改版了
後來根據自己學習過的經驗,慢慢改良
經過了一段時間,在今天終於成功爬到資料了,超感動QwQ
恭喜你順利爬到資料,而且自己研究出答案的感覺想必是很棒的 :)
我找不到,可以提點嗎,哈哈
謝謝老師,每篇都有照著實做出來,非常開心。真的適合沒學過 Python 的人 ^^
讚讚,很高興你有順利完成每個練習 :)
2022/3/5 改成這樣就成功執行了~
print(result["data"]["topic"]["latestPosts"]["postPreviews"][0]["post"]["title"])
items = result["data"]["topic"]["latestPosts"]["postPreviews"]
for item in items:
print(item["post"]["title"])
感謝分享 :)
print(result["data"]["topic"]["latestPosts"]["postPreviews"][0]["post"]["title"])
這一行一直跳出 錯誤碼說:
File "crawler-ajax-data.py", line 17, in
print(result["data"]["topic"]["latestPosts"]["postPreviews"][0]["post"]["title"])
TypeError: list indices must be integers or slices, not str 🥲
@@yaya230568 print(result[0]["data"]["topic"]["latestPosts"]["postPreviews"][0]["post"]["title"]) 這樣就可以了
2024/4/30
最近又改了
其中觀察到items前面多了個數字
也可以用for迴圈解決,改成以下就跑出來了
for i in range(1, 10):
print(result[0]["data"]["staffPicksFeed"]["items"][i]["post"]["title"])
請問大大 他的文章標題title目前放在哪裡呀 一直找不到😭😭
感謝你的分享,讚讚!
2024/11/21
1.現在chrome把request paload放在上面headers旁邊
2.payload的原始碼中,在前面幾行的「{"to":"5","limit":5...」改成「{"to":"20","limit":20...」,就可以印出20行標題
不好意思 我想請問我找不到彭彭老師說的Request Payload 請問您是在哪裡找到的
@@露卡露卡 打開開發人員工具→網路→在左邊名稱找到你要的XHR→名稱的右右右邊有標頭、酬載...,那個酬載就是payload
可以問一下你們是都有登入帳號才爬嗎?還是沒有登入就直接輸老師影片上的網址在code裡面直接執行
@@archer885 你說google帳號嗎 一般都是有登入的 但沒登入應該也可以
@ medium的,因為現階段查medium的網站 跑出來的格式跟老師影片中的不一樣,所以才想問是不是現階段要登入medium的帳戶才能進行老師影片裡的爬蟲程式
感謝老師的用心教學 一直以來 都只看得懂老師的影片 希望能出關於刷題網站題目的教學影片
最近看完了老師頻道的python入門和numpy教學 突然不知道下一步該做什麼
然後聽網上建議 就去leetcode寫題目 結果發現連第一題都無法自己寫出來
想請問老師 我現在應該做什麼比較好 同時真的也真心希望 老師能多出關於python 的影片 感謝!!
我會考慮看看呦,謝謝你的建議。
刷題這件事情本來就很難,第一時間無法自己寫出來是正常的,跟著別人的說明學習一次之後,過一段時間再回去重做第二次,還是不行自己寫出來,就同樣的程序再重新一次,最後就會有所進步了 :)
@@cwpeng-course 原來如此~那我知道了 下次我會照著這個方法來練習 謝謝老師的耐心回覆及建議! !
彭彭老師好,
Medium似乎又改版,graphql內沒有如影片 12:55 中的Request Payload資訊
可以看headers旁邊有個payload,似乎移到那裡了。
感謝 @胡怡欣 分享 :)
@@ice0921 謝謝,我本來也找不到,
幸好看到這則留言~
彭彭老師您好,
請問爬Medium的時候,一般一個graphql只會載入20個post,必須卷軸往下才會繼續載入額外的文章(同時產生新的graphql),
請問該如何讓爬蟲的程式模擬我們卷軸往下的操作,
在載入新的文章後,會出現新的graphql,此時該如何一併寫入我們的結果,
是要針對每個graphql做一樣的操作嗎( 加入requestData,發送請求並得到response,逐一output)
但每一次的requestData跟result格式是否有可能改變?
簡單來講就是有辦法一次爬取100個標題嗎 ?
可以,但需要非常仔細的去分析 Request Body 的內容 ( 我們在這個影片中無腦剪下貼上的部份 ),理解他的分頁邏輯之後,就能寫程式去處理。
去更改request data裡面"from" 和 "limit" 裡面的數字就可以決定從哪裡開始抓和抓幾篇了
2022/3/3測試:title位置如下:
qraphqi[0][data][topic][latesPosts][postPreviews][0][post][title]
# 試著列印第一頁的標題
print(result[0]["data"]["topic"]["latestPosts"]["postPreviews"][0]["post"]["title"])
感謝分享 :)
跟著彭老師的方法爬蟲教學,終於成功爬到我要的資料! 但還有一種情況尚未解決,就是在後台找到的真正資料網址往往都有一串沒有規律的數字,好像是被加密了似的.請問彭老師的短片庫中有沒有相關的教學?
谢谢彭彭老师!!!看老師的课程讓人可以比較輕鬆的入門學習python
讚讚,很高興對你有幫助 :)
老師你好, 想請問老師 :
result = response.read().decode("utf-8")
result = json.loads(result)
和
result = json.load(response)
是相等的嗎
json.loads 和 json.dumps 是相對的嗎, 謝謝老師
json.loads(字串) 或者是 json.load(可讀取的物件) 所以是不同的。json.loads 和 json.dumps 是相對的沒錯。
謝謝老師的解答
謝謝彭彭老師的分享,試了好多次,終於出來,覺得開心~
讚讚,很高興對你有幫助 :)))
彭彭老師謝謝你從第一篇看到這裡,對於寫程式有些了解了
讚讚 :)
可以問一下為什麼爬蟲爬到的內容有時候跟elements的內容不一樣 要怎麼樣可以抓取到elements裡面的內容
elements 裡面的內容很可能是用前端程式動態產生的,我們會去直接分析背後的網路連線,你可以參考上一部教學關於 AJAX 網站模式的說明 ~
老師你好,想請問老師
在result=response.read().decode("utf-8")這個部分
為什麼不能用result=json.load(response)來讀取呢?
比較沒辦法自由處理細節的編碼,但如果你寫了發現一切正常運作,那也是可以的 ~
2024/7/8
今天第一次看此影片,雖然跟影片中多少有點不同,但也盡量去修改並嘗試讀取資料了,順帶一題我是使用Edge瀏覽器
有發現每一段graphql似乎都有限制只有5篇文章,編號為0~4,每篇的Request URL也長得一樣
心想有限制也沒關係,但發現取得的網頁內容跟我用開發者人員選項看到的有所不同
開發者選項裡順位第一個關於文章的資訊其內容是網頁第一篇到第五篇文章,但實際用Python跑出來的,雖然也是五篇文章,但並不是開頭那五篇
F5重新整理幾次,再利用拿到的Request URL跟Request Data重複跑幾次,雖然文章每次可能不太一樣,但都不會是照順序的第一~第五篇文章
那些跑出來的文章似乎也是網頁中真的存在的,但順序可能就會亂跳
不清楚這情況是否正常,還是缺少了某些步驟去取得正確資料
請問你有找到"request payload"嗎?
@@guavapig6567 有
只是edge的是翻成中文好像叫"承載"
@@hina19690304 thx!
感謝你的分享,很棒 :)
我猜測是因為 我們抓到的資料都是他預設給尚未登入的人的資料 (預設的那幾筆文章)
登入後 會根據帳號喜好做推送,因此文章才都不一樣?
我一次抓25筆,25筆都沒有顯示在我登入後的文章QQ
老師您好,想請教您一些問題:
1.medium好像又改版了,無論如何重整都找不到標題
2.Request payload的位置好像也更改了,資料的呈現變得比較複雜,又如何去擷取真正所悉的資料?
3.老師我在上完這門課後有嘗試去找其他網站練習,很多時真的都找不到網站標題所在的位置,請問若真的都找不到標題該如何解決?
4.老師有推薦一些網站比較好練習爬蟲嗎?
非常謝謝老師抽空回答! 這系列的影片受益良多~
爬蟲的程式本身很依賴對網站的分析,而網站的設計方式有千百種,沒有唯一的解答,所以從這些教學中我們可以學到的是針對這幾個網站的分析方式,能否套用到其他網站則沒有一定,如果網站本身有改版,那也要重新分析處理。
Dcard 或許你可以試試看。
payload變成一個單獨的位置,不會放在headers裡面了,去headers的那一"列"找找
他變成獨立的部分
老師您好,關於最後的程式碼部分有一些問題想要請教您~
老師您使用的語法是for迴圈
items=result["data"]["extendedFeedItems"]
for item in items:
print(item["post"]["title"]
但在老師您還沒有講解這個步驟前,我有自己思考一下要怎麼打出來,最後使用while迴圈
x=0
while x
我也有這個問題 in items就會自動0-19的定義是甚麼~~
看了後面回復我來回復你 影片的for item in item => item你換成i 不要被那個字搞混淆了 就是字典的概念而已 extendedFeedItems 這個東西代表列表 他前面的是字典
感謝 @JJ Hermoso 的說明哦 :)
通常還是會使用 for 迴圈配合列表來取資料,因為你無法確定對方會不會哪天就改變了資料數量,造成你的程式無法正常運作。
感謝 @JJ Hermoso 和 老師的說明:)
感謝彭彭老師,把python講的很好懂,讓我這個外行人有機會接觸python。
想問老師以下問題:
最後的result["data"]["extendedFeedItems"][n]["post"]["title"]
[0]為何不用加引號寫成["0"]?
還有是怎麼知道[0][1][2][3]那個叫做item的?
謝謝老師!
因為那個 0 是編號喔。寫成 “0” 是字串,寫成 0 是數字。
像是
a = ["A","B","C","D"]
print(a[0])
最後結果就會出現 A
@@櫻太郎-k8k 喔喔 我懂了! 感謝你
感謝 @櫻太郎 的說明,相當清楚 :)
result["data"]["extendedFeedItems"] 這裡的result是字典 那後面的["data"]和["extendedFeedItems"]是list嗎 ?如果是list 用for跑的邏輯是甚麼? 混著的資料要怎麼用for跑
觀察取得的資料後,我們會發現 result 是字典,result["data"] 是字典,result["data"]["extendedFeedItems"] 是一個列表。取得列表後可以用迴圈取得列表中的每一個項目。建議可以回顧一下基礎的部份 ~
想要請問老師,每次的 轉編碼, 有 decode, encoding, 跟encode,通常分別什麼時候用decode,encoding,encode呢?
沒有一定的時機,要理解它的原意:把文字轉成位元組叫做 encode,把位元組轉回文字叫做 decode,在傳遞資料的時候有這類的需求時就會進行處理。
謝謝彭彭老師用心的教學,受益良多
不會呦,也謝謝你的回饋 :)
謝謝老師~按部就班寫出來好有成就感!
讚讚!加油 :)
老師 不好意思 想在這裡請問一下有機會會搞第2期的訓練營嗎 如果有的話大約什麼時候會有報名細節呢?
感謝🥺
會哦,會有第二期的訓練營,應該是會落在今年年底,有細節我會盡快讓大家知道 ~
@@cwpeng-course 謝謝老師🙏🏻
簽到,2023實測程式仍可以正常抓取。只差在最後面json分頁名稱有點不同,改一下就可以正常抓取了,謝謝老師。另外有一點腦筋有點打結,在最後面print item迴圈,原本是用[0]去抓取對應的文章標題,但在迴圈卻不需要另外用數字參數就可以全部print出來。有點想不通為什麼,可以請老師解惑嗎 QQ
感謝你的實測回報,確實很多細節都要順著思考邏輯去重新觀察修正,畢竟網站本身是一直改動的。
迴圈本身的用法是 for item in 列表: 就可以把列表中的每一個項目抓出來放到 item 中,所以就不用特別再寫編號了。
老師可以請問一下
為什麼 data=json.dumps(RequestData).encode("utf-8")
↑ 這個變數的名稱不能變更啊 ??
我一開始是用其他名像RData , rdata 之類的,但發現都沒辦法執行
換回data後才能正常運作
可以變哦,但後續的程式有用到這個變數的部份也要更著改變 ~
感謝老師,真的是解惑啊!
不會,很高興對你有幫助 :)
期待下一篇
哈哈哈,好哦 XDD
老師你好,我找不到第5個graphql,打開了所有xhl都找不到那些標題,,請問該怎樣做,謝謝
彭彭老師!我也有這個問題!( ・᷄ὢ・᷅ ),只有2個graphql,並且所有項目都找不到Request Payload
上方的選項要選到 All 或 XHR,試著重新整理,多找幾次看看,應該是有的 ~
老師你好,想請教一下request裡面因為payload所以附加一個data的資訊,想問data裡面的資料有限制是甚麼樣的格式嗎?字串?列表?字典?還是JSON?
data 的資料必須是可疊代的位元組形式哦,我知道很難懂,但你可以查詢看看我提到的關鍵字。
谢谢彭彭老师的课程。
不会呦,谢谢你的回馈 :)
想請問老師為甚麼有時候解碼是用encode,有時候又是用decode
卡一個
encode 通常指的是把文字 (chars) 轉換成更原始的位元組 (bytes),decode 則是反過來。
通常是送出連線的時候要把文字轉成更原始的位元組,取得資料的時候要把原始的位元組轉回文字。
非常棒! 請問區塊鏈課程已有規劃時程了嗎? 可能會是哪條公鏈?
還沒哦,應該是不會這麼快呀 XDDD
老師您好,有個問題請教 :
關於payload的數據,好像做了更新,複製後 在開頭的其中一段"variables":{"forceRank":true
在執行代碼之後 電腦分辨不出來,跳出了NameError: name 'true' is not defined. Did you mean: 'True'? 的提示
但是我改成了大寫的True之後 卻又無法從網頁中抓取到原始碼了。
請問這該如何修正呢?
剛剛加入了會員 竟然還有專屬會員的影片 也太物超所值了吧 老師真的很佛心
如果是有包含 true 的話,確實要改成大寫的 True 沒錯。改好之後無法抓取的原始碼的部份,可能要看看是否有更進一步的訊息可以參考,循線去解決。
@@cwpeng-course 我改成大寫的 True 就可以了 感謝
想請問老師,我該怎麼知道什麼時候要用Request Data,或是什麼時候可以像抓取PTT那樣簡單爬蟲就好?
影片中應該有提到,透過工具觀察一下連線中是否需要帶入一些資訊輸入,如果要的話就要加上去。
感謝彭彭老師, 但今天做的時候, 出現了
HTTP ERROR 405: Method Not Allowed
是表示不能再用此方法🤔?
不一定,要看看程式中是否有任何細節的錯誤,然後才能做判斷 ~
感謝彭彭老師的講解!因為本人還是一個準畢業生要寫論文,想請問老師會不會出一個教學python爬取論文標題和摘要的視頻呀(*¯︶¯*)
謝謝你的建議哪,我會盡量參考,沒辦法保證能按照個別需求提供內容哦 @@a
老師您好想詢問您,照著您的方法成功抓到文章標題了,但我發現排在網站上方的幾篇文章標題並沒有抓到,這是因為Medium網站把前幾篇標題放在其他地方的關係嗎? 謝謝~
對哦,相當有可能是如此。你可以注意到他一個網頁的資料是由很多背景的連線組合而成,所以想要哪一部份的資料,就要去找背後對應該資料的網址,然後再用我們的爬蟲程式連過去抓取。
老师,请问一下,为什么显示这个问题: print(result["0"]["data"]["topic"]["latestPosts"]["postPreviews"]["0"]["post"]["title"]) # 试着印出第一篇文章的标题
KeyError: '0'
0
print(result["0"]["data"]["topic"]["latestPosts"]["postPreviews"][0]["post"]["title"])
感謝 @Meng Lien Chen 解答 :)
老師您好:
我根據教學影片及修改成最新的title位置後,成功地爬出首頁標題了
不過爬出來的第一篇文章標題,實際上是首頁的第11篇文章
想要請問為何前面的10篇文章標題會消失爬不出來呢?
猜測是你的 for 迴圈會把資料不斷的複寫,所以只能看到最後一筆資料,前面的都被蓋掉了。
我也有疑問🤔️
想請問怎麼解決謝謝🙏
去更改request data裡面"from" 和 "limit" 裡面的數字就可以決定從哪裡開始抓和抓幾篇了
老師我又來了! 為什麼這邊的json.loads 有加s ,之前台北市資訊的那部不需要s呢???
www.geeksforgeeks.org/python-difference-between-json-load-and-json-loads/
這篇應該可以幫助到你~~
@@劉昆琳 謝謝你的幫忙! 也謝謝這個頻道~
意思是 為 json 原編碼的data即利用json.load()即可,
而被decode("utf-8")解碼過後會變為json 的字串型態 即需利用json.loads()嗎?!
如果理解錯 希望可以指正~
@@黃柏文-v2q 我的理解跟你差不多,所以在"網路連線程式、公開資料串接"這篇教學中,台北市的公開資料網頁為json格式,所以就使用json.load即可,而在"網路爬蟲 Web Crawler 教學 - Request Data 操作實務"這篇教學中,從Medium.com上抓取的資料為"字串型式",可以用type(result)這個函示去檢查,所以需使用json.loads將其轉為"字典型式",以上是我個人的理解,如果有誤還請大家多多指教,謝謝~~
感謝 @劉昆琳 的分享,相信對大家都很有幫助的 :)
請問老師未來有機會講道scrapy框架嗎?一直覺得老師的課講得很清楚,也比較習慣聽老師的課說
目前沒有規劃,但很謝謝你的建議,我會考慮看看 :)
老師,我上完了您所有的入門課程,首先感謝您用心的教學。想請問老師怎樣把最後讀到的數據逐行寫到excel?我上網研究了很久,知道pandas/openpyxl可以導出到excel,但是研究了很久都不太成功。跳出來總是說資料不符合dataframe的格式,請問老師可以給個代碼參考一下嗎?謝謝。
建議直接輸出成 CSV 的格式,Excel 自然就可以相容了,你可以搜尋 Python CSV 處理這樣的關鍵字去找到相關的程式碼。
@@cwpeng-course 好的,謝謝老師。
@@cwpeng-course 老師,我研究出來了,把資料存到csv的程式碼,跟大家分享如下:
result=json.loads(result)
with open('Medium.csv', 'w', encoding='utf-8', newline='') as f:
thewriter=writer(f)
header=['Title']
thewriter.writerow(header)
items=result["data"]["topic"]["latestPosts"]["postPreviews"]
for item in items:
info=item["post"]["title"]
thewriter.writerow([info])
#使用writerow方法必須將字符串轉化成列表,否則就會一個字符占一個單元格。所以加上[ ]即可。
讚讚,恭喜你順利完成,獨立解決問題很棒 ~
謝謝澎澎老師的教學
我卡在網頁資料分析那邊卡好久還是找不到標題
索性就用其他資料去爬了
也是可以抓出來東西但不知道在甚麼位置XDDD
不知道老師有推薦哪個網頁可以方便爬蟲呢
medium還是抓的到阿,只是路徑需要找一下,跟老師影片的不同
感謝 @johnsonzhao9684 實測回報,確實很多細節都要順著思考邏輯去重新觀察修正,畢竟網站本身是一直改動的。
請問老師為何requestdata是用"encode", response.read()是用"decode"呢?
encode 是把字典轉換成字串(編碼)的意思
decode 是把字串轉換成字典(解碼)的意思
仔細想一下 Python 中 字典 和 字串 的區別和作用,
字典可以方便我們拿資料, 比如 dictionary = {"a":1, "b":2} , 我們可以用 dictionary["a"] 拿到 a 的值 1
雖然字串無法做到這點, 但我們需要字串來發送網絡請求
所以我們先把 requestdata 從字典轉換成字串 (encode) 再發送出去
收到 response 後再把它從字串轉換成字典 (decode) 方便我們拿資料
感謝 @G T 詳細的說明,相信對很多人都很有幫助,讚讚 ~
老師您好我想請問我按照影片的編碼 (但是網頁不同)在with req.urlopen那行出現HTTP Error 419: unknown status
請問該怎麼解決
以目前的資訊我無法有更進一步的判斷哦 ~
彭彭老師您好,我想請問您
如果得知網頁是json,也跟著您的步驟練習
後來去抓其他的網頁,卻找不到您說requests payload
這樣是該怎麼辦
謝謝彭彭老師
網站的狀況其實很多變,幾乎不太可能一一列舉,所以得實際看到底是哪個網站,要抓什麼資料而定 ~
彭彭老師您好,我想請教您:跟著您的步驟練習,當執行程式時遇到以下問題,
Traceback (most recent call last):
File "crawler-ajax-data.py", line 11, in
},data=json.dumps(requestData).encode("utf-8"))
NameError: name 'requestData' is not defined
如何解?
可能前面的程式的 requestData 名字有打錯吧 ~
老師您好:
我參考了您爬蟲系列的影片後嘗試爬了591租屋網的資訊,但遇到以下問題:
(1) 若我於headers後只加上資料所在實際網址及User-Agent二項資訊,剩下的一切皆按照影片中程式碼撰寫,console執行後會出現HTTPError: unknown status
(2)若我於headers後加上資料所在實際網址、User-Agent、Content-Type("application/json")與requestData(view source後呈現的原始碼為is_format_data=1&is_new_list=1&type=1&)這幾項資訊,剩下的一切皆按照影片中程式碼撰寫,console執行後會出現 requestData= is_format_data=1&is_new_list=1&type=1&
^
SyntaxError: cannot assign to operator 的錯誤訊息,想請問老師該如何解決此問題,感謝老師!
requestData="is_format_data=1&is_new_list=1&type=1&" 要加雙引號。
老師您好,照著做到decode的步驟後print 出來
程式顯示NameError: name 'true' is not defined
也檢查過程式碼了 不曉得哪邊出問題了?
再麻煩您了
我也有遇到同樣的問題!
但把 true 改成 True 就可以了~~
希望能幫到你!
感謝 @李妍伶 的分享 :)
请问老师requestData为什么要用json.dumps换成json格式啊,感谢
不是转换成 json 格式, 而是转换成 string
@@tg6640 明白了,谢谢啊
感謝 @G T 的說明 :)
@@tg6640 那應該是把資料從字典轉成字串才對,影片裡彭彭老師講解時剛好反過來了~
老師我遇到問題了
程式碼:(註:posts是老師改成items前的程式碼)
posts=result["data"]["extendedFeedItems"]
錯誤訊息:
TypeError: list indices must be integers or slices, not str
請問我該怎麼解決呢 有google過 但好像....找不太到解決方法
資料型態有變喔 你試試 posts=result[1]["data"]["extendedFeedItems"]
感謝 @矇矇 的分享,讚讚 ~
我找問題了 他的資料庫形式有改 字典最前面多一個[0]
你把print(result["data"]["extendedFeedItems"][0]["post"]["title"])
改成print(result[0]["data"]["extendedFeedItems"][0]["post"]["title"])
註解掉後 後面一樣參考老師的打法 只是新的資料形式前面一樣要多一個[0]
items=result[0]["data"]["extendedFeedItems"]
for item in items:
print(item["post"]["title"])
我也撞到這個問題找了好久 自己找到解答好有成就感 感動 謝謝彭彭老師
@@cwpeng-course 自己去化問題好有成就感 雖然找到解答之前很痛苦 感謝彭彭老師的教學~
老師你好,我從前一部影片練習時爬到網站標題的地方點選payload,但網站顯示的payload=to=1717572574018&ignoredIds=33e743431419&ignoredIds=803bff156c94&ignoredIds=e01ff8f55ad5&page=5,所以在跑程式的時候,他說這不是json格式出現error。我下一步應該怎麼解決呢?可是點選其他地方都沒有網站標題了...
這個確實不是 JSON 格式,這是另外一種格式叫做 application/x-www-form-urlencoded,你可以試著把 Content-Type 改成上面那段格式名稱看看。
彭彭老師您好打擾了,想請問為什麼會出現以下錯誤
程式碼
print(result[0]["data"]["webRecommendedFeed"]["items"][0]["post"]["title"])
錯誤訊息
print(result[0]["data"]["webRecommendedFeed"]["items"][0]["post"]["title"])
KeyError: 'data'
他的意思是找不到這層資料嗎?😭😭
研究好久了,都研究不出來😔
在這邊先謝謝彭彭老師仔細的教學,讓我對爬蟲跟程式終於有點概念,教得很仔細~!
謝謝辛苦了!🙇♀
就是結構中沒有 data 對應的資料。這段要根據實際上取得的資料結構來做對應的調整,我估計網站本身已經更新過了,所以要仔細去確認實際上抓到的資料長相來處理。
請問你解決了嗎? 我也遇到一樣的問題
27:24 老師每次說印出來印出來的時候 我都想到印粗8 哈哈XDD
XDDDDD
老師您好
請問一下 我照著您的方法試了一下 可是在 標頭 裡面 只有回應標頭跟要求標頭 沒有 request payload 可是有多了一個承載 裡面有兩個一個要求乘載跟檢視來源 但是資料都是一點點而已 謝謝
網站顯然是有改版了,所以很多東西不會完全一樣,可能找找 graghql 這個路徑的連線吧 ~
為何這篇的,items=result["data"]["extendedFeedItems"]
for item in items:
print(item["post"]["title"])
這裡的items就不像AJAX / XHR 那篇的posts一樣,那篇的posts是字典的形式而這裡的items好像卻不是字典形式?該怎麼分辨是不是字典?(有看過可疊代資料型態那篇了)
上次有問過AJAX那篇posts的問題,這裡想要再兩個比較看看謝謝老師
字典會是 {} 包裹,列表會是 [] 包裹。然後要根據實際抓到的資料去調整程式。
请问老师,我在爬数据的时候,找到了request payload, run的时候出现NameError: name 'false' is not defined, 这个false 隐藏在request data里面,怎么处理
我解决了这个问题,但是Content-type: application/json; charset=utf-8 后面这个charset=utf-8是做什么的,我还是会有错误urllib.error.HTTPError: HTTP Error 500: Internal Server Error
500: Internal Server Error 代表对方的伺服器程式接收爬虫发出的要求时,产生错误,为什么会产生这个现象的实际原因还很难说。 charset=utf-8 只是代表传递的内容使用 utf-8 编码。
老师你好,请问 encode(“utf-8”) 和 decode(“utf-8”)之间有什么区别
encode 是把文字转换成位元组 (bytes),deocde 是反过来 ~
再請問另一個問題,我看老師下指令使用utf-8的時候,有時候用encode("utf-8"),有時候用decode("utf-8"),請問這是為什麼? 該怎麼判斷何處該用哪一種? 謝謝
encode() 是把字串變成位元組,decode() 就是把位元組轉回字串。所以如果取得的資料是位元組的形式,想轉成字串處理,就會用 decode(),例如從網路的回應取得的原始資料就是位元組的形式。
@@cwpeng-course 老師那請問為什麼一開始拿到requestData時要先encode呢? 一開始拿到的原始資料不是就是位元組了嗎?
感謝老師 ,但medium 網站好像又更新了
變相下滾動 title會自動增加
request數目也會動態增加
能夠抓到一開始的內容就算成功了,滾動後新增的內容也可以找到對應的連線資訊的 ~
終於進步到22集啦
讚讚!
請問老師,我也可以用requests方式模組來發出請求嗎? 這時候用get是不是不太能用,我上網查是要用POST發請求,這兩者的主要差異在哪呢?
可以使用 requests,基本概念和內建的模組是一樣的,因為 requests 也是基於內建的模組做包裝,語法有差異而已。
他現在payload那邊裡面的內容有一項是......"variables":{"forceRank":true,"paging":{"limit":5}}....,其中那個true的t是小寫一直被python報錯...
只好改成大寫的 T 了 ~
現在2024年2月16日 是不是又改了?找不到那個XHR是正常的嗎?
網站通常不喜歡爬蟲,而且也是會一直改版的。所以學爬蟲要學核心的思考和觀察方式,然後根據最新的狀況去找到關鍵點、調整細節 ~
彭彭老師,請問如果出現Internal Server Error怎麼辦,謝謝老師
這代表對方的伺服器出現錯誤,如果確認我們這邊發出的 Request 是正確的,那通常就無解,是伺服器端的問題
老師你好 請問
到17行哪裏
result=json.loads(result)
items=[0]["data"]["topic"]["latestPosts"]["postPreviews"]
一直跑出錯誤碼 如下:
TypeError: list indices must be integers or slices, not str
謝謝老師
你貼的程式似乎是有點不對?實際上若網站的結構有所更動,我們就得根據抓到的資料格式,來判斷這整段應該怎麼寫才會正確 ~
要再寫一個for去抓後面的值
EX:
posts = result[0]["data"]["topic"]["latestPosts"]["postPreviews"]
for item in posts:
print(item["post"]["title"])
medium 網站好像又改寫法 剛看 它裡面的 graphql 和 data的內容和影片中不一樣 找不到和影片中一樣標籤
graphql 應該是還沒有改,他有很多個,要小心地找 ~
@@cwpeng-course 好的 那我再找找看 感謝老師 ! !
2022/12/18更新後也可用
感謝確認和分享 :)
彭彭老師好 想問"medium網站"尚有其他標題,想要爬下全部標題。但它們藏在不同graphql裡頭 且 Request Payload都不同。 請問這樣有辦法抓全部Request Payload中的代碼嗎? 網站這樣設是不是想避免有人輕易爬下全部資料,所以故意分流。 請問有辦法嗎@@? 麻煩彭彭老師了
你得把它們背後相關的連線全部找出來,然後一個一個去爬取。
通常不是刻意為了避免爬取,只是單純這樣設計對他們網站開發比較方便而已,但其實我們無法去 100% 判斷別人的團隊做這件事情的意念是什麼。
想問老師是如何判斷網站需要複雜的請求
按照影片中的展示,使用開發人員工具去觀察連線的細節來判斷
老師:
這裡的result=json.loads(result)和
[2018年6月11日Python 網路連線程式、公開資料串接影片裡的]data=json.load(response)
在load後面差了一個s,似乎也不能替換,請問差別在哪裡和各要用在什麼地方呢?
使用的語法是 json.load(可讀取的物件) 另外一個是 json.loads(字串)。所以確實不能替代,而是看當下我們想要轉換的內容是可讀取的物件 ( 例如檔案物件、網路回應物件 ) 或是字串來決定。
謝謝老師的回覆
請問老師這是怎麼回事
PS C:\Python Training> python crawler-ajax.py
File "C:\Python Training\crawler-ajax.py", line 12
with req.urlopen(request) as response:
^
SyntaxError: invalid syntax
光是錯誤訊息看不太出來,可能需要完整的程式碼 ~
請問老師 出現403禁止訪問 但是都有用headers
要看看細節的程式才知道是否有什麼問題哦 ~
請問medium是不是又改版了,可以用HTML的方式抓取對嗎?
改版是很有可能的,所以爬蟲我們要學的是其中分析的方法和精神,網站持續會改版,寫爬蟲的人都要持續去調整自己的程式來應對。
老師,你好,
我只先做到印出程式碼就出問題了,回復的錯誤如下:
C:\Users\user\AppData\Local\Programs\Python\Python39\python.exe: can't open file 'C:\Users\user\Desktop\python training\crawler.py': [Errno 2] No such file or directory
我重複對了好幾遍還是不知道錯在哪,希望老師可以告訴我有可能錯的地方,謝謝。
試試看建立的資料夾名稱中間不要使用空白 ~
老師請問一下
我複製payload 中的 {"forceRank": true, "paging": {"limit": 5}} 的true 一直顯示錯誤,說沒有被定義,請問要怎麼解決,謝謝
把 payload 中的 true 都改成 True 試試看。
網站似乎再次更新了,這個網站看來是很討厭被人爬Xd(不過其實大部分網站都討厭?
話說google在同時間爬取大量網站的資料這件事情上努力,但是一般網站並不喜歡被爬,那google這麼做不會被討厭嗎?
網站經營者基本都不喜歡對自己無益的爬蟲,把立場轉換一下就可以理解了。Google 爬蟲對網站經營者來說可以帶來流量,自然就不排斥,甚至希望 Google 爬越多越好。
老師您好:
我在headers內加了"apitoken"執行後結果會噴錯,跳出關於這行「with req.urlopen(request_2) as response:」且說HTTPError: Internal Server Error,想請問是什麼原因呢?
我找到原因是什麼了,不用勞煩老師了🤣
讚讚,有解決就好 :)
原本跟著上一篇做的時候怎麼做都失敗,我還以為不知道是哪裡弄錯了,看到這裡才知道原來是那個網站改版了,原來需要這樣做才會成功,目前是有成功的,附帶一提現在又有小改了,範例中的result有五層[" "]就抓的到標題,現在中間變成八層了
感謝分享,爬蟲和網站之間就是一個對立的概念,網站有所更動爬蟲就必須跟著調整。所以學習的時候,要學到核心的思考和網站分析方式 ~
老師mua😘愛死你了
XDDDDD
老師好,我用urllib模組進行連線可以成功,不過改用requests模組連線卻得到403,請問是因為requests模組有什麼限制嗎?
應該不是什麼特別的限制只是沒處理好細節而已 ~
又又又改版了 現在的連線不會一次把含標題的資料一次回傳 會有好幾個含有標題資料的 graphql 回傳
雖然可以抓到標題 但是不是我想要的標題
請問該如何特定某個graphql 或是依序做處理呢
我發現我抓到的標題大概是在好幾個graphql中偏中間的
去更改request data裡面"from" 和 "limit" 裡面的數字就可以決定從哪裡開始抓和抓幾篇了
感謝 @K先生 的說明,確實如此 :)
老師你好,我在requestData=Request Payload
複製貼上但顯示錯誤,我找一找結果是{"forceRank":false這部分錯誤我應該加上引號嗎?
這是Payload的程式碼(完整的複製貼上,回去看他真的這樣寫)
謝謝老師
還是將 f 改成大寫
可以將 f 改成大寫試試看。
你好 老師 也不知道有什麼問題
File "crawler-ajax-data.py", line 10
"user-agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
^
SyntaxError: invalid syntax
是否可以看看完整的程式碼呢?可能是後面的 , 多出來的問題,也可能是其他問題
老師可以教如何防止被反爬蟲嗎??? 謝謝彭彭老師
一般常見的會使用 reCAPTCHA 這個工具可以有效地防止大多數爬蟲,但沒有絕對萬無一失的方法 ~
想請問:
requestData的部分出現NameError:name 'false' is not defined,如何解決
把 false 改成 False 嘍
@@cwpeng-course 那個false是直接包含在requestData中的,直接被我複製貼上
@@cwpeng-course這是我的requestData: [{"operationName":"WebInlineRecommendedFeedQuery","variables":{"forceRank":false,"paging":{"to":"10","limit":5,"source":"3b26c279-4ab7-45b2-8ece-fa7cf416d42e"}},"query":"query WebInlineRecommendedFeedQuery($paging: PagingOptions, $forceRank: Boolean) {
webRecommendedFeed(paging: $paging, forceRank: $forceRank)
@@williamkau326 我知道,試著改成 False 看看,在 Python 裡面布林值就必須寫成大寫的 False
彭彭老师,想加入您的专属课程会员,但是大陆无法paypal支付,有别的方式能支付吗?或者怎么私聊您?
看起来您已经加入了呀,欢迎欢迎 :) 原则上就是透过 UA-cam 的机制来处理哦,没有特别额外的方式。
@@cwpeng-course 找了个paypal代付,付了双倍的价格,才得以订阅
老師想請問一下如果想用pandas
去讀他的json資料
但也是出現權限被拒絕該怎麼解決
Pandas 應該沒有處理網路連線的事情,你要使用 Pandas 處理資料,還是要先確認爬蟲相關的程式能否抓到資料,權限被拒可能就是沒有成功抓取到資料而已。
老师你好,我写了一段代码,会报出以下错误:
TypeError: unbound method harry_input() must be called with HarryPython instance as first argument (got nothing instead)
代码如下:
class HarryPython:
def harry_print(a):
print(a)
def harry_input(b):
input(b)
def harry_ord(o):
ord(o)
r=HarryPython.harry_input()
基本語法錯了,你要重新看彭彭老師關於class的應用基礎和進階你就會明白
感謝 @chen Dk 的說明哦 :)
老師好,謝謝老師的教學,這個網站好像又改過了,我貼上新的request payload到requestData裡,但就出現bug了,bug的意思有點像是說requestData有錯,但只是複製貼上而已,並沒有去更改,不知道可不可以麻煩老師在教我們一次,初學者沒有經驗,不知道錯在哪裡就卡住了。
爬蟲爬取網站的資料,其實一直都是站在網站開發者的對立面,網站有任何更動爬蟲程式都很容易失效要調整。因此建議就試著從影片中抓住關鍵的思考和分析方式,再想辦法延伸到新的狀況中。
有時間我會再多提供一些例子 ~
真的很謝謝老師,網頁爬蟲本就不是很好學,因為網站是一直持續更新且新技術是一直出來的
若網站是Form Data 形式的話, requestData要怎麼寫呢?
謝謝老師!
Content-Type 要設定成 application/x-www-form-urlencoded。
requestData 就寫 x=3&y=4 這種格式。
老師你好
在撰寫request時
request = req.Request(url, headers={
"Content-Type": "application/json"
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62"
}, data=json.dumps(requestData).encode("utf-8"))
卻跑出錯誤
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62"
^
SyntaxError: invalid syntax
想請問我這部分是哪裡有問題呢?
"Content-Type" 這一行的最後面少了一個逗號
如果 WebServer 有用 session 技術,可以把網頁抓下嗎?
可以,但需要的技巧又更多了 ~~~~