iT邦幫忙

2021 iThome 鐵人賽

DAY 20
0
AI & Data

爬蟲怎麼爬 從零開始的爬蟲自學系列 第 20

爬蟲怎麼爬 從零開始的爬蟲自學 DAY20 python網路爬蟲開爬-3抓取整頁標題

  • 分享至 

  • xImage
  •  

前言

各位早安,書接上回我們已經知道抓取想要的網頁資訊的邏輯了,也成功抓到了,今天我們的目標是抓取一整頁文章標題

開爬-整頁標題抓取

一樣以 PTT 股票版為例
繼續加強我們的程式
我們先打開原始碼看看標題在哪
https://ithelp.ithome.com.tw/upload/images/20211002/20140149SVMQ6zaQ1t.jpg
可以看到跟昨天文章內容不一樣 因為這上面的資訊都是實時更新的
我們要的標題位置以中鋼紀念品為例

一樣右鍵檢視網頁原始碼 接著按 CTRL+F
就會出現可以查詢文字的地方
打上要搜尋的 中鋼紀念品 它就會顯示文字位置
https://ithelp.ithome.com.tw/upload/images/20211002/20140149Puv2Liv0SG.jpg
可以看到它是在 < div class="title" > 標籤內

所以程式碼後面加上

titles = data.find("div", class_ = "title")

建立 titles 變數存放我們的資料
資料從 data 裡解析過的資料內 抓取 標籤為 < div > 且 class = "title" 的資料
也就是我們剛剛看到 中鋼紀念品 的位置

因為我做這篇時間太久
所以 PTT 更新了
但是我們要抓的依舊是文章標題沒錯
https://ithelp.ithome.com.tw/upload/images/20211002/20140149eVYNKYUCR5.jpg
等等應該會抓到這個標題
到時候你們抓到的會是你們網頁開起來後的第一個標題

最後把 print 內改成 titles
程式碼目前是這樣

import requests
import bs4

url = "https://www.ptt.cc/bbs/Stock/index.html"
#抓PTT股票版的網頁原始碼

request = requests.get(url)
#將網頁資料利用requests套件GET下來

data = bs4.BeautifulSoup(request.text, "html.parser")
titles = data.find("div", class_ = "title")
print(titles)
#解析網頁原始碼

執行 python crawler.py
https://ithelp.ithome.com.tw/upload/images/20211002/20140149Z9dSc2eZYT.jpg
成功印出了 但是有討厭的標籤在不好看

那如果想要去掉標籤
就要再往內指定
把 print(titles) 改成 print(titles.a.text)
因為可以看到我們要的文字部分是在 < div > 標籤內的 < a > 標籤裡
而變數 titles 本身就已經指定到 < div > 標籤內了
所以再 .a 就好
最後的 .text 則是指定 < a > 標籤內的文字部分
https://ithelp.ithome.com.tw/upload/images/20211002/2014014935NEYEwKVK.jpg
就像這樣 成功只剩下文字了

但是我們要看不會只看第一個標題吧
所以要整頁的標題就要 把 titles = data.find 改成 titles = data.find_all
就是從找到一個變成找到全部
但是光這樣不行 直接執行會噴錯
因為現在 titles 內有好幾個 < div > 標籤跟 < a > 標籤
所以要用 for 迴圈一個一個印出來
https://ithelp.ithome.com.tw/upload/images/20211002/20140149B1wwDsS54Y.jpg
最後就像這樣 得到整頁的文章標題了

如果在執行上遇到錯誤 代表文章中有已經被刪除的
https://ithelp.ithome.com.tw/upload/images/20211003/201401495u1aefbXPP.jpg
因為被刪除的文章沒有 a 標籤 程式會找不到目標就噴錯
必須在 for 迴圈中加一個 if 用來去掉沒標題的文章

改成這樣就可以了
https://ithelp.ithome.com.tw/upload/images/20211003/201401490rqPs8Gz9r.jpg
可以看到沒有噴錯 剩下的文章標題也正常印出

今天的程式碼

import requests
import bs4

url = "https://www.ptt.cc/bbs/Stock/index4991.html"
#抓PTT股票版的網頁原始碼

request = requests.get(url)
#將網頁資料利用requests套件GET下來

data = bs4.BeautifulSoup(request.text, "html.parser")
titles = data.find_all("div", class_ = "title")
#解析網頁原始碼

for title in titles:
    if title.a != None:
        print(title.a.string)
#利用for迴圈印出全部並篩選掉已被刪除的文章

今天我們已經能印出整頁所有標題 而且沒有標籤影響美觀 也篩選掉已刪除的文章
明天我們要來實作更進階的功能


早安閒聊區

你知道嗎?

販毒比吸毒判刑更重喔 (珍愛生命遠離毒品 碰了不只犯法還會變笨喔)

每日二選一

你希望另一半比自己年長還年輕呢


上一篇
爬蟲怎麼爬 從零開始的爬蟲自學 DAY19 python網路爬蟲開爬-2網頁解析
下一篇
爬蟲怎麼爬 從零開始的爬蟲自學 DAY21 python網路爬蟲開爬-3我已滿18歲(cookie)
系列文
爬蟲怎麼爬 從零開始的爬蟲自學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
小白一枚
iT邦新手 5 級 ‧ 2021-10-11 20:40:42

令人敬佩的鐵人大大您好
感謝您的熱心分享
小白實做一遍,原網站原始碼稍有修改
因此git分享
當作習作繳回
附上傳送門
https://github.com/Alice049/simple_string_debug.git
再次感謝分享喔

這篇文章有幫到你真是太好了

我要留言

立即登入留言