老師您好,想結合上次學的串接網路資料 將爬蟲結果印出在一個文字檔案上面。 以下是我的思考邏輯: 因為會印出標題的是這段程式碼 import bs4 root=bs4.BeautifulSoup(data,"html.parser") titles=root.find_all("div",class_="title") #找尋class="title"的div標籤 for title in titles: #如果有a就印出來 if title.a != None: print(title.a.string) 所以我只要將他原本會印在終端機上面的指令改成輸出txt的指令 所以我就稍微改了一下: import bs4 root=bs4.BeautifulSoup(data,"html.parser") titles=root.find_all("div",class_="title") #找尋class="title"的div標籤 with open("data.txt","w",encoding="utf-8") as file: #開啟文字檔 for title in titles: #如果有a就印出來 if title.a != None: file.write(title.a.string+" ") #印出爬蟲內容 可是執行起來都只能印出第一頁的內容,想問為什麼會這樣? 是不是我程式碼的位置放錯了? 再請老師幫忙解答了,謝謝彭彭老師!
for title in titles: if title.a !=None: print(title.a.string) # 若標題含a nextlink=root.find("a",string="‹ 上頁") # 找到內文是‹ 上頁 的 a 標籤 請問老師 同樣是標籤內的a 為何一為變數 另一是字串?
for abc in titles: print(abc.string) 我在stackoverflow看到他這樣建議 soup.findAll(True, {'class':['abc', 'edf']}) 那我這樣改 root=bs4.BeautifulSoup(data, "html.parser") titles=root.find_all{'span':['abc', 'edf']}) for abc and edf in titles: print(abc.string) print(edf.string) 好像不太像樣XD 如果再複雜一點,除了span之外,還有a標籤,都可以這樣加嗎
彭彭老師您好 我寫了一個可以讓使用者輸入"要抓取的頁數"與"關鍵字"的爬蟲 但發現只要PTT標題中有特殊符號(@)就會出錯 TypeError: argument of type 'NoneType' is not iterable 已經有使用utf-8,我應該如何解決? 感謝彭彭老師辛苦錄製影片教學
一路看到這邊真的越看越感動!老師讓我覺得世上又多了一個善良的人!
謝謝你的回饋 :)
好
本來想去Python報名課程,還好有看到老師的教學頻道,老師真的幫很多人省了很多錢,之前有去補過其他的,能像你一樣教的淺顯易懂的老師真的不多,而且麥克風的聲音聽起來也很舒服,不會有沙沙的聲音
謝謝你用心的回饋,能夠幫上大家的忙我覺得很愉快,一起加油嘍 :)
確實~~ 我已經上過很多很貴的課程了 有些是大專院校推廣部的 但好像彭老師得更好懂
幹從頭看到這裡真的 很 值 得!!!
前面學到的字串、字典、迴圈、函數、網路連線等等,到了爬蟲這個部分都用到了!
我本來還以為字典怎麼這麼拉基,還要自己去定義單字和意思,後來才發現字典的功能完全不只是這樣。
除此之外我還大致了解了cookie這個東西,以及如何去爬蟲多個頁面!
我以為開放式課程是不可能有這麼清楚的收音以及淺顯易懂的教學,直到我看了彭彭老師的課程。
除了感謝彭彭老師還是感謝。
那在以老師的程式碼為基礎下,我有試著運用了前面講的檔案讀寫的程式碼,並且試著抓了八卦版的50個頁面的資料寫入到檔案中,有一個地方困擾了我很久,就是要對檔案使用讀取(r)、還是寫(w),之後上網爬了文才知道是要用append(a),一開始一直用w導致檔案每次都被新的一頁覆蓋掉。
感謝你的分享和這麼詳細的心得回饋,很高興對你有幫助哦 :)))) 後面能夠自己解決一些細節的問題表示你學得相當不錯了呢 ~~
我是对编程零基础的小白,年龄有大没有信心学习了,但是自从发现老师的视频以后对学习python有了兴趣和信心。感谢老师细心详细的视频讲解 !
谢谢你分享自己的状况让我知道,很高兴对你有帮助 :)
如果世界上每一個老師都跟你一樣那就太棒了!! 謝謝老師~~
謝謝你這麼說 :) 我要繼續加油才行惹 ~~~~~~
想學Python剛好看到老師的頻道,每天下班從這系列看到現在
收穫太多了,謝謝彭彭老師!
很高興對你有幫助 :)
恨不得按100個讚阿~~ 超詳細講解,感謝彭彭老師!
哈哈哈哈,謝謝你的回饋壓 :))))
感謝老師清楚的教學~抓到資料好開心!!
好哦!不會 :)
很有成就感~希望老師繼續拍有關python的影片
很高興對你有幫助,會哦,原則上會持續有新的教學 :)
謝謝老師! 教得很詳細!
我自己土炮弄了一個部落格 (很簡單的用html+css) 然後用 Apache 裝在不要的電腦上 (設定什麼的都還沒看老師另外的教學影片,單純自己挖網路上的資源東補西補...很破爛XD),設定好網路連線後再利用 openssl 上鎖頭。學完老師的 Python 爬蟲影片之後,就用另外一台電腦爬自己網站的資料XDD 很有成就感
讚讚,謝謝你的經驗分享,我覺得超棒的 :)
感謝老師!實在太有收穫了!希望老師再多多增加python的課程!
謝謝你的回饋 :) 我會盡量哦 ~~~
天啊,安啾穿制服也太正了吧
謝謝彭彭老師!
哈哈哈,我也覺得,不客氣呦!
上了兩次python課程,也看彭彭的影片事前準備,後來發現彭彭的講解最棒
謝謝你的分享和回饋,很高興對你有幫助哦 :)
老師好讚 講解得非常清楚
謝謝你 :)
老师讲课慢条斯理的,简直是我这种慢性子头脑慢的人的福音。
很高兴是适合你的 :)
謝謝彭彭老師,
想要學PYTHON,看了許多教學,老師很用心的從頭說明到尾.
不會呦,也謝謝你的回饋 :)
彭彭老师,您的讲解真好,我一个外行都听得津津有味!希望看到您更多的视频。
好的,我基本上会持续更新内容,尽量喽 :)
程式零基礎的我都學會了,真的大推。
讚讚,很高興對你有幫助 :)
一直想學爬蟲,看影片比看文章學習快多了,謝謝老師無私分享,不過老師說話真的好慢我都調1.5倍速XD
哈哈哈,很多人都說要調 2 倍速 XDDDD
+1調1.5 XD
很感謝老師的教學,在國外求學要找到好教材自學很不容易...
不會哦,有幫助就好了 :)
强大的资料,平和的语调,赞一个
谢谢回馈哪 :)
非常感谢,这么详细且清晰易懂的讲解!再次感谢!
谢谢回馈,很高兴对你有帮助哦 :)
簽名報到!很受用的課程!!
太好了!!
超級實用詳細的教學。謝謝彭彭老師
不會呦,謝謝你 :)
老師您好,想結合上次學的串接網路資料
將爬蟲結果印出在一個文字檔案上面。
以下是我的思考邏輯:
因為會印出標題的是這段程式碼
import bs4
root=bs4.BeautifulSoup(data,"html.parser")
titles=root.find_all("div",class_="title") #找尋class="title"的div標籤
for title in titles: #如果有a就印出來
if title.a != None:
print(title.a.string)
所以我只要將他原本會印在終端機上面的指令改成輸出txt的指令
所以我就稍微改了一下:
import bs4
root=bs4.BeautifulSoup(data,"html.parser")
titles=root.find_all("div",class_="title") #找尋class="title"的div標籤
with open("data.txt","w",encoding="utf-8") as file: #開啟文字檔
for title in titles: #如果有a就印出來
if title.a != None:
file.write(title.a.string+"
") #印出爬蟲內容
可是執行起來都只能印出第一頁的內容,想問為什麼會這樣?
是不是我程式碼的位置放錯了?
再請老師幫忙解答了,謝謝彭彭老師!
你的邏輯沒有問題哦,只是我們打開檔案寫入資料,每次打開都會把檔案清空。
解決方式也很簡單,打開檔案的時候用串接模式就可以,例如:
open("data.txt","a",encoding="utf-8")
注意裡面的 w 改成 a,就可以嘍 ~
@@cwpeng-course 可以印出來沒有問題了!謝謝老師
看老師的頻道可以多學很多很多東西,老師超棒
讚讚,一起學東西 :)
謝謝老師教學辛苦了,也請老師多開一些這樣的課程
謝謝你的回饋,好哦,我會盡量 XDDD
在python網路爬蟲教學 - Cookie 操作的後段,nextlink = root.find("a" , string="< 上頁") ,print(nextlink) , 出現 None, 找不到該標籤, 請問老師這是什麼問題呢? 語法我有檢查,並沒有錯。
那個 < 符號,你可以按照影片中的流程去複製,他不是單純用鍵盤打出來的 < 和空白。
很不錯的影片,教學易懂有成就感
謝謝你的回饋 :)
謝謝彭彭老師:)期待新的影片
不客氣 :) 好哦,我會持續出影片的 ~
彭彭老師您好,
想請教您兩個問題:
①
時間軸24:25
最後一行print(nextLink["href"])
請問要取href屬性網址的話,為什麼nextLink後面是用中括號包住href呢?
②
時間軸28:26
如果第23行這裡的變數已經是pageURL,
為何上方第3行的def getData() 括號內的參數仍維持 (url) 呢? 請問這裏的(url)的功用是什麼?
謝謝老師 >_
1.
我們要取得標籤的屬性,要使用括號,這個算是規矩。
2.
參數只在函式中有效,所以這個 url 就是接受我們呼叫 getData() 的時候傳遞進去的資料,在外面的程式中,我們會把本次抓取到下一頁網址放在 pageURL,然後傳遞到參數中進行下一個網頁的抓取。
感謝老師>_
謝謝老師! 目前第一集看到現在 搭配書籍努力精進自己中!!希望可以朝軟體工程師之路前進,再次謝謝老師!
不會,加油 :)
彭彭老師您好,剛剛加入會員,有一個問題想請教您。
最近我的React專案有一個需求: 使用者登入後,24小時內重整頁面仍然可以保持登入狀態,請問這也是用cookie達成嗎? 在您看來,實現這個功能的best practice是甚麼呢? 想請您提供一個方向,我做進一步的研究,感謝您~
登入系統的登入狀態是要前後端一起看得,首先要先決定採用的身份驗證架構是什麼,使用 JWT 儲存在前端,或者是儲存在伺服器端。如果使用 JWT 儲存在前端,那確實主要就是由 Cookie 的過期時間來控制。但登入系統的實作方式很多種,所以你得先確定系統登入方式的實作是採用哪一種方式,然後才能判斷可以從哪些地方來控制登入狀態。
@@cwpeng-course 謝謝老師!! 我再研究研究
我花了半天時間,居然學會怎麼爬資料了!!!
彭彭老師的教學果然簡單易懂~~
想請問若網站有登入頁面時,怎麼等待使用者輸入帳密後,再繼續下面的抓取動作呢?
哈哈哈,很高興對你有幫助 :)
使用者輸入帳密之後,大多數網站其實會在 Cookie 中放置一些資訊。所以我們其實只要實際用電腦輸入一次,然後觀察和擷取 Cookie 裡頭的資訊放進程式中,就等於是使用者已登入狀態了。
不過現實中還有很多其他可能性,這大概是爬蟲最麻煩的地方,變化很大很大。
彭彭老师课程很好,谢谢老师
謝謝你的回饋 :)
老師你好, 請問一下如果有些在view source沒有出現的, 但是在inspect > elements裏面有的, 可以怎樣找呢? 謝謝
那就是動態產生的畫面,必須從 Network 的紀錄中尋找真正的資料來源在哪裡 ~
謝謝老師詳細的說明
不客氣,也謝謝你的支持 :)
老師,想問
1. 第20行nextlink=root.find("a",string="‹ 上頁") ,為何不用像上一支影片尋找"title",寫find("div",class......)?
2. 第21行return nextlink["href"] 的["href"],為何要用中括號[]呢?
第一個問題是因為你要找的是特定的連結,這個鏈結被包在上頁這個結構中,而上一支影片則是找所有titles,而所有title都是被包在 標題這個結構裡,如果你用上一支影片的方式找是找不到上一頁的連結的喔
感謝 @曾子凡 的詳細說明 :)
謝謝老師精彩的講解!
想請問老師為甚麼我照著老師打print(nextLink["href"])
會出現TypeError: list indices must be integers or slices, not str呢
把你全部程式碼貼出來比較好判斷吧
感謝 @陳俊豪 回覆,確實如此哦 ~
應該是你前面用成find_all()
改成print(nextLink[0][‘href’]) 試試看?!
老師您好: 我跟著您的教學步驟做到抓取內文為 < 上頁 的 a標籤時一直失敗,我在網頁原始碼所看到的內文是 "‹ 上頁",因此我嘗試了nextLink=root.find("a",string="‹ 上頁")也無法, 上網查詢後發現‹似乎是叫做轉譯字符,想請問老師我該往哪個方向求解
他的符號並不是英打打出來的
彭彭老師您好:
想請問您為什麼在過濾文章有沒有被刪除那個地方一定要寫if title.a != None
不能寫 if title.a == True
有試過第二個寫法了,會抓到其他資料
另外,真的非常謝謝彭彭老師提供這些教學影片!受益無窮!
因為 title.a 是一個物件或者是 None,物件和 True 不會是相等的東西哦。
老師請問def getData(url):裡面帶的url參數是對應到哪個呢?因為試圖把def getData(url)的url改成pageURL發生找不到超連結的狀況,謝謝老師回復
getData 函式內部會使用到 url 參數,你仔細檢查程式就會看到。所以你隨意把名字改掉,內部的程式會找不到東西是很正常的。
在影片中24:28部分,輸入print(nextLink["herf"]),但是系統跑出TypeError: list indices must be integers or slices, not str,請問要怎麼處理?我不是mac
有錯字 nextLink["href"]
請問最後寫while迴圈時,先寫一行getData(pageURL)合理嗎?
想法是要先呼叫函式出來的,取得回傳值,然後下一行才有回傳值來覆蓋pageURL。
白話點就是覺得好像要先起個頭
確實需要一個起頭,所以一開始就寫了 pageURL="起頭的網址"
如果為了起頭的網址去呼叫 getData() 就顯得有點多出來。
for title in titles:
if title.a !=None:
print(title.a.string) # 若標題含a
nextlink=root.find("a",string="‹ 上頁") # 找到內文是‹ 上頁 的 a 標籤
請問老師 同樣是標籤內的a 為何一為變數 另一是字串?
字串是告訴 find 這個方法要找的標籤名稱是什麼。title.a 是物件中的實體屬性。
老師您好:
為何有些網址有出現要必須要按已滿18歲的按鈕才能進去的畫面,但是用上一支影片的code卻可以直接抓到標題呢(不會像老師那樣抓不到標題)?? 但進入網頁時,確實有over18這個cookie! 這邊不太理解,在麻煩老師解答了 謝謝
同問
整個PTT有18禁的都還是搜得到
試過用其他有18禁的網站會被擋
但網頁找不到HTML
想上課卻卡好久 ...
要看你說的網頁是什麼,每個網頁實作的方式有差異,其實無法一概而論。爬蟲其實很依賴對基礎網頁運作知識的理解,所以只要稍有差異,我們就必須各別分析,很可能背後的原理差異很大的。
想請問一下老師 為甚麼第15行 裡面的class要加一條底線變class_
而第20行的 string卻不用
BeautifulSoup 套件的規矩而已哦。
這個規矩是因為 class 這個字是 Python 的保留字,不能被當成參數使用 ~
艱難地啃完了第20堂課,謝謝老師解
加油 ~~
請問我照著老師的解法處理到
nextlink=root.find("a", string="‹ 上頁")
print(nextlink)
會出現以下錯誤
UnicodeEncodeError: 'cp950' codec can't encode character '\u2039' in position 58: illegal multibyte sequence
nextlink=root.find("a", string="‹ 上頁")
print(nextlink)
可是如果是用print(nextlink["href"])就不會有問題
我查過\u2039 是 ‹ ,想知道為甚麼會有這個問題?
先確認程式檔案使用 utf-8 存檔。舊版的 Python 也可能會有狀況,如果是 Mac,使用 python3 來執行程式。
請教一下彭彭老師!! 我在原始網頁裡看到的"< 上頁" 是 "‹ 上頁" , 但是不論我在我的程式裡打前者或是後者, 均無法讓程式成功執行,請教該如何解決這個問題呢!!
建議用複製貼上的方式,像我影片中一樣的操作。因為那個符號本身跟鍵盤打出來的其實是不同的東西,只是看起來很像而已 ~
請問老師之後可以把這些教學以後可以用到的地方講出來嗎? 因為我認為學習需要一個目標的動力去促使, 也可以大概了解這方面的應用(純屬個人意見)
謝謝你的建議,我會盡量分享嘍 :)
想問老師為何 31:07第二個 pageURL 後面要加的是 getData(pageURL)
我看不懂 getData(pageURL) 顯示的會是甚麼字串(是字串連接嗎?)
getData(pageURL) 是上面的函數 會回傳一個string(仔細看函數結束地方的return值) , 所以 “.....” + getData(pageURL) 等同兩個string連接沒錯
感謝 @勝維李 的回應,很清楚 ~
辛苦了呀
不會,謝謝 :)
彭彭老師:
會想要開始學Python是因為上星期無意間看到了一位youtube原本因想要訂一間旅館訂不到,聽了那位youtube大略的說明,再加上我上網查了相關字,大概就是爬蟲吧!而再從網路上看爬蟲的相關資訊幾乎都是以python居多,好吧! 那我就從頭開始學習python吧!
原本我是學android studio 的java,我覺得python 及java,多多少少還是有一些不同的地方,例如說在java一句表達完之後,都要一個"逗點" ,但python不用。 或者是java的if一定會再接著一個括號,寫裡面要做的事,但在python不用括號,直接表達要做的事情。但更重要的事,在python這裡,寫程式的縮排是非常重要的事,要不然會出現錯誤(我不確定這點我有沒有誤解!!!!)
但謝謝彭彭老師很清楚的講解,至少能讓我在很短的時間內,從一開始的該如何安裝、if、for等等之類的一路學到了python.
目前有想要試著一個網站的爬蟲,大部份的網站會從a網頁將相關的資訊都一起夾帶著網址傳遞到b網頁,我可以藉由b網頁直接抓取相關的資訊。但有的網站它不是由網址一起傳遞到下一頁,看了cookie的地方,也找不到相關的分析。希望彭彭老師能再教學一些爬蟲的教學,即使是收費我也會想要付費學習。
謝謝
謝謝你這麼用心的訊息和回饋,我也很高興對你有些幫助 :)
爬蟲的情況很多,我會試著多做一些實際的分析給大家參考,但我猜想應該很難把所有可能性都說完,希望下次挑選的爬蟲主題會幫得上你的忙哦,也謝謝你的建議,我會參考的 ~~~~
老師您好
如果我是用google colab寫呢
要先處理google colab及瀏覽器間的關係嗎?如何處理?
我和 Colab 不太熟,所以對於你的問題我沒有太大的掌握。剛剛簡單 Google 查詢一下 Colab Python 爬蟲,似乎是有一些順利運作的範例,您可以查詢看看。
謝謝老師3年以來的教導 請問老師能做R語言跟C++的課程嗎? 對它們兩個有點興趣.😁😁😁
三年了呀,謝謝你幫我回顧時間 :)
短時間內可能無法,至少也要半年之後,看有沒有多出來的時間 @@a
+1
謝謝彭彭老師清楚的教學,讓我這個初學者也可以自己抓到資料,但是我有一個問題想問老師,就是我想把標題抓到檔案裡面
但是都沒有成功,想問一下是哪邊寫錯了
for title in titles:
if title.a !=None:
boo=(title.a.string)
with open("data3.txt","w",encoding="utf8") as file:
for x in boo:
file.write(x+"
")
謝謝老師
執行的時候,是否有什麼錯誤訊息呢?
應該是"utf-8"
老師不好意思我想請問一下
while迴圈的getDate(pageURL)
是同時有跑函式與return新的網址的功能嗎?
是的話 是不是也代表著getDate(pageURL)可以有兩種功能?
任何函式執行後都可以有回傳值,我們只是拿來運用在這個程序中而已,最後的問題我沒有非常理解你的意思 ~
老師您好
我想要輸出TXT
可是僅印出最後一行
但是terminal卻是可以完整輸出
請問是哪裡出現問題,謝謝
import bs4
root=bs4.BeautifulSoup(data,"html.parser")
titles=root.find_all("div",class_="title")
for title in titles:
if title.a !=None:
data=title.a.string
print(data)
file=open("PTTData2.txt",mode="w",encoding="utf-8")
file.write(data+"
")
file.close()
open 的地方改成 mode="a" 它才會把資料附加在檔案後面,不然每次都會複寫檔案內容。
老師的課程好棒ㄚ,學生不是本科的努力學習中,因為一些因素不能直接邊寫邊測試網頁資料,只能先抓成html的檔案到本機,請問老師抓下來的檔案能試爬嗎?我改成這樣 url="C:/Users/BENQ/Downloads/ptt.html" 類似這樣,測試都會顯示錯誤,請問這有辦法修改嗎? 謝謝
不行哦,本機和網路上是完全不同的事情。如果要抓本機檔案就直接用 open 打開檔案就可以了。
不好意思,老師想問一下,不知道為什麼我打print(nextLink)的時候,
出現的是‹ 上頁
disabled的地方不是應該是href=~~
接著如果打print(nextLink["href"]) 則會出現
Traceback (most recent call last):
File ".\L20test.py", line 16, in
print(nextLink["href"])
File "C:\Users\ASUS\AppData\Local\Programs\Python\Python37\lib\site-packages\bs4\element.py", line 1486, in __getitem__
return self.attrs[key]
KeyError: 'href'
找了很久還是不太懂為什麼會這樣
看起來是你抓到的網頁已經沒有上一頁可以按了,所以是 disabled 而且沒有 href
謝謝老師~~~
不會 :)
彭彭老師您好, 我執行到這一行 nextlink=root.find("a",string="< 上頁") 時, nextlink抓不到"< 上頁"的回傳值, 因為PPT網頁的上頁原始碼裡變成"‹ 上頁", 故找不到, 請問該如何解決?
那個小於符號是特殊符號,不是鍵盤上打出來的那個小於。所以我們會直接去開發人員工具中複製貼上,你可以複製這個:‹ 上頁
應該就可以了 ~
@@cwpeng-course 原本使用"‹ 上頁"跟"‹ 上頁"都不行的說,複製老師的就可以了!!!
可以請問老師,這種問題是否能有別的解法嗎?像是直接用"上頁"執行,不然有時候會跑出奇怪的符號,整個就無解了。
老師,能多開一課說一說每次請求時會同步更新現有的cookies嗎??
因為cookies過期後會抓不到想要的資料,然後要手動去更新cookies
感謝!!!
嗯嗯,謝謝你的回饋和建議,我會考慮看看的 :)
@@cwpeng-course +1我也想學
彭彭老師好~請問一下如果要把多個頁面的標題寫入檔案中,程式撰寫上的思維是甚麼流程呢?
目前有成功寫入單個頁面的標題到檔案中(上一支教學影片的內容),但這次的內容試了幾次還是卡關,所以才想請教您。
可以試著利用一個變數先儲存所有的字串資料,最後再一次寫到檔案中。
@@cwpeng-course 謝謝老師,我再多嘗試幾次看看
老師,謝謝你的分享。有點小問題請問一下的,
如果說我想抓網頁2-3個class的資料,可以用for loop同時把它print出來嗎? 好像有點困難呢~~
謝 謝!
請問你是指同時具有特定3個class的tag,還是只要含有1個那3個之一的class?
如果是前者可以參考這篇,在findAll()函數加上額外參數 stackoverflow.com/questions/18725760/beautifulsoup-findall-given-multiple-classes。
或是用findAll( attrs = {"class" = "你要的class1 class2 class3"} ),這樣的寫法比較像是js的selector。
如果是後者可以findAll() 3次再print出來,但可能會重複唷。
你好啊,謝謝你的回覆啊。
我現在的代碼是
import bs4
root=bs4.BeautifulSoup(data, "html.parser")
titles=root.find_all("span", class_="abc")
for abc in titles:
print(abc.string)
我在stackoverflow看到他這樣建議
soup.findAll(True, {'class':['abc', 'edf']})
那我這樣改
root=bs4.BeautifulSoup(data, "html.parser")
titles=root.find_all{'span':['abc', 'edf']})
for abc and edf in titles:
print(abc.string)
print(edf.string)
好像不太像樣XD
如果再複雜一點,除了span之外,還有a標籤,都可以這樣加嗎
謝謝 @呂晟維 的回應 :)
我想如果是不同標籤,可以分開來做,或許會單純一些 ~
謝謝
不客氣呦 ~
感謝🙏老師❤
不會 :)
想請問老師兩個問題
1.我用Visual Studio Code 在打備註得時候打中文會無法run
2. 我有install beautifulsoup但是按run的時候 我出現AttributeError: module 'bs4' has no attribute 'beautifulsoup'
感謝老師 學得很有動力
1. 打中文無法 run 可能和 vs code 無關,如果是 Mac 電腦請用 python3 來執行程式。
2. 要注意大小寫,是:BeautifulSoup
很感謝~
請問老師編碼格式為:Big5 , 要如何操作換頁 , 因為他的herf是href="javascript:pql_search('3')" , 不是一般的超連結 , 無法用NextLink那段
謝謝回復
那個超連結背後是執行一段程式,我們需要去研究它實際發出的連線是什麼,然後直接連過去。
細節其實相當複雜,可能要多開一個影片來講解才行了 @@a
謝謝彭老師看您的影片讓我這個門外漢似乎也可以開始寫一點小程式了 請問老師有沒有自動填寫GOOGLE表單的教學
謝謝你的建議,我會考慮看看。
你可以先自己找找看 Selenium 這個工具 ~
老師 您好
我到處爬文 或 看留言
都找不到 26:02 那個 縮排 是怎麼辦到的
按完整個鍵盤都找不到
請老師賜教了
圈選你要縮排的行後按Tab統一增加縮排,shift+Tab統一減少縮排
@@何祐豪-p1y 結果剛剛重開就可以了 非常感謝你的幫忙
感謝 @何祐豪 的回應 :)
老師您好請問: print(nextLink["ref"]) 這一行出現了 TypeError: 'NoneType' object is not subscriptable 要怎麼解決?
老師我想問一下,如果我把網頁的Request Headers中的全部項目都寫進我的程式裡,
是不是就表示不管怎樣都能進入到這個網頁?(個人亂想的問題XD)
原則上只要是使用者能看到的東西,爬蟲都能模擬的出來沒錯。不過有些網頁設有重重關卡,沒有正確的分析運作流程,就會找不到路。意思像是迷宮確實有解,但不是每個人都能順利走出來的 ~
老師請問如果想搜尋範圍是 標題跟內文2部分,當關鍵字 (有出現) 才篩出文章,這該怎麼寫呢 謝謝
必須去標題列表的 HTML 中找到內文的連結,然後再發一次連線去取得內文的資料,接著判斷內文是否包含關鍵字,再確定是否要把標題展示出來。
這不是一個簡單的動作哦,要把程式邏輯都兜起來 ~
請問會有網站把資訊放在local session storage的嗎?還是大家都是放cookie
會有的,要看實際的應用決定前端要怎麼存放資訊。
請問彭彭老師,我想練習抓一個股票的現價,用的是Cmoney股市,在檢視原始碼中有股價的內容,可是我print出root看,卻沒有包含股價的那個div(用root.find(string="股價")顯示None),後來發現是跑到另一個script的標籤下,可是無法讀取script標籤下的子標籤,請問該如何解決呢?
這個其實就相當難處理了,建議使用 selenium 這類的工具模擬瀏覽器的運作來抓取資料,但可能就無法在留言中詳述嘍 ~
@@cwpeng-course 了解~謝謝彭彭老師!
老師為什麼我在28:25的那一次執行 with req.urlopen(request) as response: 跑的時候會出現錯誤
應該是打錯字, 我貼上全部程式給您
import urllib.request as req
import bs4
def getData(url):
#建立 request 物件, 並加上 headers={"user-agent":"Mozilla..."} 模擬人工訪問,否則會被拒絕
#八卦版多了一個是否滿18歲的按鈕, 要增加 cookie
request=req.Request(url, headers={
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36",
"cookie":"over18=1"
})
with req.urlopen(request) as response:
data=response.read().decode("utf-8")
root=bs4.BeautifulSoup(data, "html.parser")
#print(root.title) #看板 movie 文章列表 - 批踢踢實業坊
#print(root.title.string) #看板 movie 文章列表 - 批踢踢實業坊
titles=root.find_all("div", class_="title")
for title in titles:
if title.a == None: #分析原文, 有些不會有 a 標簽
continue
print(title.a.string)
#抓取上一頁網址
nextLink=root.find("a", string="‹ 上頁") #找到內文是 "‹ 上頁" 的 a 標簽
#print(nextLink["href"]) #取href
return nextLink["href"]
#讀取資料
pageUrl="www.ptt.cc/bbs/Gossiping/index.html"
#for i in range(1,4):
# print("page",i)
# pageUrl=getData(pageUrl)
# pageUrl="www.ptt.cc"+pageUrl
count=0
while count
感謝 @Stephen Huang 的分享 :)
老師不好意思,想請問昨天試了八卦版
for title in titles:
if title.a!=None:
print (title.a.string )
試了之後一直有錯誤
可能不再a標籤內,看一下頁面的代碼
@@占时年 謝謝,原來是find忘記all
感謝 @占时年 的回應 :)))
@@cwpeng-course 謝謝老師
彭彭老師您好:
如果我只需要擷取八卦版[新聞]亦或者是[問卦]這部分的標題,
我有嘗試用pandas去讀取,
但還是失敗,想請教老師有沒有解法,謝謝~~
你只要稍微用字串的關鍵字判斷,就可以很輕易的處理哦,類似像以下這樣的:
if "關鍵字" in "某個字串":
@@cwpeng-course 非常感謝 已經解出來了☺️☺️
谢谢彭彭老师的教学分享,文科生用这个方法成功爬了豆瓣小组标题。但在尝试爬谷歌搜索结果时,只能爬到当前页面,无法抓取多页,nextLink=root.find("a", string="Next") 这一行里,不晓得该用什么替换“a”。请问该怎么解决呢?十分感谢!
如果我们看到的页面版本是一样的话,搜寻后,直接看下方的第二页的连结,按右键去检查背后的程式码,试着找找看 class="fl" 这个特性的 a 标签吧 ~
請問老師會出使用Scrapy和抓JSON格式的教學嗎?
JSON 格式的教學好像前面的影片有一些您可以找找看。
Scrapy 應該短時間內不會有哦 ~
老師請問一下,我照老師教的爬蟲程式觀念,試著去寫一個抓取網站圖片的程式,但是抓到的圖片有些是正常的,有些特別小或者只有網站圖片的其中一小部分,是哪個部分寫錯了才會變成這樣子,下面是我的程式碼
沒有看到你的程式碼哦。如果能夠正常抓到圖片,只是比你預期中的小張,通常是你以為抓的網址是大張圖片的網址,實際上是小張的。得再進一步去分析到底真正大張的圖片網址在哪裡。
@@cwpeng-course #自我嘗試爬蟲程式
#試著抓取網頁圖片,並且存檔到指定資料夾
#抓取unsplash網站的圖片
import os
import urllib.request as req
import requests
import bs4
import time
def getpicture(searchname):
#圖片搜尋網址,利用unsplash.com/ 網站
url="unsplash.com/s/photos/"+searchname
#給網站使用者資訊
requese=req.Request(url,headers={
"user-agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Mobile Safari/537.36"
})
#取得網頁資訊
with req.urlopen(requese) as response:
data=response.read()
#使用beacifulSoup4套件,取得圖片網址
root=bs4.BeautifulSoup(data,"html.parser")
images=root.find_all("img")
#建立存放圖片的資料夾
folder_path='C:\\Users\\User\\Desktop\\'+str(searchname)
if not os.path.exists(folder_path): #如果資料夾不存在,則建立資料夾
os.makedirs(folder_path)
#將圖片存檔
for index,image in enumerate(images):
if image:
html=requests.get(image.get('src')) # get函式獲取圖片連結地址,requests傳送訪問請求
imageName=folder_path+'\\'+str(index)+".png"
with open(imageName,mode="wb") as file:
file.write(html.content) # 寫入圖片的二進位碼
file.flush()
file.close()
time.sleep(3) #強制停止3秒在執行程式 #必須先載入time模組才可使用
#執行函式,輸入想要搜尋的圖片
getpicture("rive")
老師不好意思沒注意到沒附上程式碼
@@鰻魚燒 你的程式會抓取網站中所有的 img 標籤,一方面可能會包含其他非主要圖片的圖片 ( 例如頭像 ),另一方面它的 src 屬性指定的圖片本身確實不是它本來原始尺寸的圖片,是縮小過的。
所以你得進一步去找到它原始尺寸的圖片的網址,點開之後的那個 download 按鈕對應的網址你可以試試看,但也很可能不一定會很順利,爬蟲本身就是不受網站歡迎的東西。Unsplash 有提供官方的 API 可以抓到他們的圖片資料,有正規的管道,其實也不一定要使用爬蟲。
@@cwpeng-course 感謝老師的回覆,我再嘗試看看
彭彭老師好,想請問一下為什麼程式抓取的原始碼會跟網頁原始碼不一樣?例如說我抓下來的原始碼長這樣:‹ 上頁,但是網頁原始碼卻長這樣:‹ 上頁,網址不太一樣,這是為什麼????
網頁的 HTML 程式碼中,有一種概念叫做跳脫字元,也就是原始碼長得是一種奇怪的表達符號,就像你貼的 ‹ 這樣,會被解碼程某種比較有意義的形狀,就像 ‹ 這樣的 ~
老師,我正在試一下實作,發現如果網站中出現空白,例如說那個
class_="FYwKg _2j8fZ_1Fy _2x7kk_1Fy mCDH2_1Fy"
當中的空白鍵,好像便不能跑了,請問有方法可以解決嗎?謝謝!
那個相當於有多個 class 的設定,你可以寫 class_="FYwKg _2j8fZ_1Fy" 取其中一個試試看 ~
請問按照語法寫return nextlink["href"] 出現錯誤訊息
SyntaxError: 'return' outside function 如何解?
可能是 return 這行程式,沒有適當縮排的原因。
老師您好:想請教您一個問題,為什麼我的visual studio code的terminal裡面,跑出來的結果常常沒有辦法對齊?都會像下面這樣,每隔一行都會多空幾格呢?一直被這個問題困擾很久...。另外謝謝老師的影片教學,真的很淺顯易懂!
Re: [新聞] 7歲童上柔道課遭摔瀕腦死昏迷16天 昨腦
[問卦] 疫苗是不是再怎麼爛也比沒有好?
[問卦] 看好世界 龍巖漲停板是在嘲諷嗎??
PS D:\PYTHON>
如果取得的資料確實沒問題,某種程度上可以不用太在意,因為實際的需求通常也不是印在終端機,至少是輸出到檔案裡面。
不然就是要確認程式中是否有不小心放到空白的可能性。
今天照著打還是連線遭拒耶,ptt是不是又增加甚麼防衛機制了?
我也是這樣
你可以用get我剛剛測試用get就不用管user-agent 老師教的方法為什麼不能用我也想等看看老師會不會解釋
@@kaokevin1775 太感謝你了,我也有找到用get用法的影片,一起進步吧!
感謝 @kao kevin 的回應和分享 :)
至於為什麼會不能用,可能要先仔細看看你寫的程式和錯誤訊息才能進一步判斷嘍 ~
會不會是在cookie的後面少了逗號? 我找半天,結果就是缺了一個逗號XDDD
今天是 20200305 連線沒問題喔!
太好了这个教学
耶,谢谢 :)
彭彭老师可以告诉我一下,你运行python时候的快捷键是什么吗?就是在TERMINAL里面运行的时候输入的那个
我只是按方向键的上下,可以找回之前输入的命令。
老師您好:在進入八卦板後因為本人未滿18歲按不同意就跳出來了該怎麼處理
影片中的操作應該就可以解決了 ~
老師您好
import bs4 後VSCode顯示Import "bs4" could not be resolved from source Pylance(reportMissingModuleSource)[8, 12]
請問該怎麼解決?
你在 VS Code 中安裝了 Pylance 這個擴充輔助功能,建議直接移除就可以了。不然就要去學習如何設定 Pylance 的細節讓它適應你的運作環境,這個錯誤很可能和 Python 程式本身無關。
感谢老师
:)
老師我遇到一個操作上的問題, 在最後設定的迴圈數(跑出來的頁面標題),我跑出來的是【網頁的原始碼跟標題】,跟影片中跑出來只有【文字的標題】有點不太相同,請問我要怎麼處理,才能只呈現只有【文字標題】的結果呢?
從抓取【一個頁面的標題】30:20那邊開始 然後,出來的畫面都是一個【html+文字標題】,迴圈的部分也如同一般,【跑一個網頁+文字標題】,就是說 我的操作出來的結果 跟影片中跑出來的都是【文字標題】的結果是不一致的。
更新一些: 我發現是我搞烏龍,我上面的 print (data)沒有刪除,所以就一直跑出HTML代碼😅😅😅
好哦,有解決就好,能自己處理是最好的哪,都是寶貴的經驗 :)
老師您好 我是使用 python3.7.1和vs code 1.40.2 想問一下 我用 F5+enter (Python File Debug the currently active python file ) 在終端機上 顯示的 不是繁體中文 而是一些問號跟亂碼 例如:(??12/6?唬葉撣?銝楝敺蝎曄?鈭楝銵?閮???) 想請求老師幫幫忙......嘗試很久都無法改善,程式碼都是按照老師上面打得 ,
可能要確認一下作業系統,如果是 Mac 的話,使用 python3 來執行程式。
请问老师,为什么在代码print下用for 循环保存到TXT文件中只有最后一页的结果?而打印确实多页的结果呢?
打开并写入档案会把原来的资料覆盖。
可以试着用 open(档案名称, mode="a") 来处理看看 ~
彭彭老師您好
我寫了一個可以讓使用者輸入"要抓取的頁數"與"關鍵字"的爬蟲
但發現只要PTT標題中有特殊符號(@)就會出錯
TypeError: argument of type 'NoneType' is not iterable
已經有使用utf-8,我應該如何解決?
感謝彭彭老師辛苦錄製影片教學
colab.research.google.com/drive/1zO6IoeBj3prfo9btZZYqQFpJLie3sx67?usp=sharing
將程式放至google colab
看起來是解決了 :)
想請問彭彭老師如果要寫入檔案 該在哪個位置加with open這個指令
這很看整體程式的搭配,並沒有固定的答案。其中一種想法是把頁面中的資料先都串接到一個變數中,再一次寫入檔案,如果採取這種想法,就把寫入檔案的程式寫在最後面就可以 ~
又完成一課了~
讚讚 ~
老師我有一個問題,就是我的終端機裡面輸入檔案名卻顯示出【python: can't open file 'crawler-cookie.py':[Errno 2] No such file or directory】這是什麼原因呢?
終端機路徑中沒有檔案,按左邊你的檔案右鍵點選「Open in integrated Terminal」
@@kennedyokay 謝謝您的回答。這個問題,當初我在執行檔案的時候檔案是放在「子資料夾」裡面,後來我改成[單獨]開啟『子資料夾』才解決這個問題。
@@kennedyokay 不好意思,想請教您關於終端機的清屛問題,我在其他檔案下輸入【cls】可以做清屛的動作,但是在跑完cookie爬蟲的時候,卻無法清屏,這個問題我該怎麼解決?是我的VSCODE少了什麼軟件?還是~~~我需要安裝什麼軟件?
@@8princessv3 這個問題我沒有遇過,可能要等老師或其他人來做解答。
感謝 @鍾承恩 的回答 :)
首先,他的意思就是找不到檔案在哪裡,如果你把程式放到子資料夾,那執行的時候就必須把子資料夾明確的寫出來,例如:python 子資料夾名稱/檔案名稱。當然,如果你單獨開啟子資料夾那也沒問題。
後面這個問題確實蠻奇怪的,或許你可以試試看 clear 這個命令會不會成功。