iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
Python

Python大戰之網頁爬蟲系列 第 20

[Day 20] Scrapy爬蟲框架-2

  • 分享至 

  • xImage
  •  

接續先前的內容,我們要開始爬取我們要索取的爬蟲了。

首先,我們先把將start_urls的值
修改為需要爬取的第一個URL:

https://ithelp.ithome.com.tw/upload/images/20241004/20169196tZ3W8dXTUg.png

所要爬取的網頁為: http://www.itcast.cn/channel/teacher.shtml

接著,我們再修改下方的程式碼parse():

https://ithelp.ithome.com.tw/upload/images/20241004/20169196Sr9UAtK2n8.png

針對修改的方法,這邊再來做一些解釋:

filename = "teacher.html"

這邊新增定義了一個變數 filename,它的值是 "teacher.html",
表示我們要將抓取到的網頁內容存儲到這個名為 teacher.html 的文件中。

而這個文件將會存放在運行爬蟲的目錄中,
也就是我們前一天有提過的爬蟲資料夾內。

open(filename, 'w').write(response.body)

這邊使用 Python 的 open 函數打開或創建名為 teacher.html 的文件。

'w' 模式:

這個是在open函數中的一個方法,代表寫入模式,
如果文件不存在,會自動創建。如果文件已經存在,這將覆蓋文件中的內容。

這邊也查詢了其他有關讀寫檔案的語法,大家可以參考一下。

https://ithelp.ithome.com.tw/upload/images/20241004/20169196ZB74ToOXzb.jpg

而response.body 就是 Scrapy 從網頁獲得的原始 HTML 資料,
我們使用 write 方法將 response.body 的內容
寫入 teacher.html 文件中。

在最終,我們會在本地文件夾中生成一個 HTML 文件,
保存了這個網頁的完整內容。

修改完程式碼後,我們回到剛剛開啟的cmd中進行執行,
我們要輸入scrapy crawl itcast,這個是在scrapy裡面通用的執行語法。:

https://ithelp.ithome.com.tw/upload/images/20241004/20169196Z2R0DJm25a.pnghttps://ithelp.ithome.com.tw/upload/images/20241004/20169196OGDZNDctBD.png

但我們可以發現,上面是沒有正確執行的,
我有想到可能是賦值的問題,所以我又對程式碼做了一次更改:

https://ithelp.ithome.com.tw/upload/images/20241004/20169196FlOqCe74CO.png

然後在cmd做再一次的執行:

https://ithelp.ithome.com.tw/upload/images/20241004/20169196dWJSx26Y9S.png

這次則出現了INFO: Spider closed (finished)
代表我們有成功執行了。
我們就可以去本機上的爬蟲資料夾看一下有沒有東西了:

https://ithelp.ithome.com.tw/upload/images/20241004/20169196N8LZGrUbht.png

可以發現,我們的資料夾內出現了一個Chrome HTML Document檔案,
我們可以點進去看一下:

https://ithelp.ithome.com.tw/upload/images/20241004/20169196mj7dcjhwCI.png

這個就是我們獲取到的網頁了。


那在可以準確的獲取網頁後,我們就要來試著獲取裡面的資訊了。

這邊的目標是想獲取該網頁「導師」相關的訊息,
那因為學習網頁所介紹的Xpath是我之前沒有接觸過的,
學習的時間也相對不足,所以我透過改編程式碼來獲取數據,
而沒有使用範例所推薦的方法。

那就先來看看更改過後的程式碼:

https://ithelp.ithome.com.tw/upload/images/20241004/20169196AhQo2ve4m1.png

這邊先針對修改的程式碼他們的功用來做一些講解:

teachers = response.css('div.li_txt'):

這一行是使用 Scrapy 中的 CSS 選擇器來抓取包含教師信息的 div 元素。
div.li_txt 就是表示它會選擇所有類名為 li_txt 的 div 元素,
這些元素就包含該網頁教師的姓名和職稱。

for teacher in teachers:

這一行是 for 循環的意思,就是找出從上一行選擇的
所有 div.li_txt 元素,其中每一個 teacher
都是對應於一個教師的 HTML 區塊。

name = teacher.css('h3::text').get():

這行則是一樣使用了 CSS 選擇器來提取教師的名字。
h3::text 選擇 h3 標籤中的文本內容。

title = teacher.css('h4::text').get():

這行則是提取教師的職稱,來使用 h4 標籤中的文本。
(上述兩行都要透過觀察HTML來跟著改變,並非一成不變)

yield { 'name': name, 'title': title }:

這邊就是將每位教師的名字和職稱作為字典返回。
這些數據可以後續處理,例如保存到 JSON 文件或數據庫中。

簡單總結,這段代碼的目的是從指定網頁 http://www.itcast.cn/channel/teacher.shtml
上提取教師的名字和職稱,並且把這些信息抓出來或者保存。

Scrapy 框架會自動幫我們處理好所有 HTTP 請求跟響應,
而我們只需要專注於從回應中提取我們需要的數據就好了。

那知道上述程式碼是什麼功用後,就要直接來執行了:

我們這邊用的執行碼是scrapy crawl itcast -o teachers.json,
簡單來說就是把獲取的數據轉換成JSON檔來呈現:

https://ithelp.ithome.com.tw/upload/images/20241004/20169196tnEhI7R166.pnghttps://ithelp.ithome.com.tw/upload/images/20241004/20169196w8Khc8wU5K.pnghttps://ithelp.ithome.com.tw/upload/images/20241004/20169196HNzrSGV8wR.png

如果有出現上述的畫面跟最後的INFO: Spider closed (finished)
就代表我們成功執行了。
接著我們就可以回到本機內的爬蟲資料夾內,來看看有什麼變化:

https://ithelp.ithome.com.tw/upload/images/20241004/20169196MQP3jEhIXB.png

可以看到上面多出了一個JSON檔,這就是我們剛剛所產生出來的成果。
那我們就點進去來看一下:

https://ithelp.ithome.com.tw/upload/images/20241004/20169196YdKETMxsG9.png

這就是我們所想要抓取的成果了,收工!!!


小結:

我們利用這兩天的時間學習了scrapy的相關內容,
必須要說,Scrapy的學習真的比其他的爬蟲工具還要麻煩許多,
最直觀的就是不是透過在編譯器內直接執行,而是需要跳到專案目錄中,
光是這點就令我頭痛不少。

不過透過這兩天的學習,我也對於scrapy的知識增進不少,
無論是語法或者是它的操作方式,都讓我對於爬蟲概念又更加進步了。

參考資料:

https://www.runoob.com/w3cnote/scrapy-detail.html
https://ghost831105.medium.com/python%E5%AD%B8%E7%BF%92%E6%97%A5%E8%AA%8C-%E6%AA%94%E6%A1%88%E8%AE%80%E5%8F%96-%E5%AF%AB%E5%85%A5-%E6%A8%A1%E5%BC%8F%E6%AF%94%E8%BC%83-r-a-w-caac9e1aef72


上一篇
[Day 19] Scrapy爬蟲框架-1
下一篇
[Day 21] 存儲數據-pandas
系列文
Python大戰之網頁爬蟲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言