iT邦幫忙

2023 iThome 鐵人賽

DAY 6
0
自我挑戰組

待業不頹廢系列 第 6

Day 6 . 欸 今天要幹嘛 - 優化、整理中學習

  • 分享至 

  • xImage
  •  

行前說明

準備來優化這幾天搭建起來的 code,原先自己筆記的註解都拔掉,
新的註解來表示優化的部分

import requests
from bs4 import BeautifulSoup

base_url = "https://astro.5xruby.tw/testimony/"

num_pages = 7

for page in range( 1, num_pages + 1):

    if page == 1:
        page_url = base_url  
    else:
        page_url = f"{base_url}page/{page}"  

    response = requests.get(page_url)
    response.encoding = "utf-8"
    
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, "html.parser")
        
        data = {} ##### 沒用到準備移除
        author_infos = soup.find_all("h4", class_="is-author")

        for author in author_infos:
            print(f"Author: {author.text}") ##### 優化使閱讀更容易
    else:
        print(f"Failed to retrieve page {page_url}")

輸出顯示的樣子"漏漏等"

print(f"Author: {author.text}") ,看起來是全部都有,
但變成需要很不智慧的一個個數,我們就來動點手腳吧
https://ithelp.ithome.com.tw/upload/images/20230921/201501812AeQCyO6RT.png

是說最原本一開始是寫 print(author.text) 這樣而已

for author in author_infos:
    print(author.text)

下方三種,優化演變過程

  • print(author.text),顯示 By XXX
  • print(f"Author: {author.text}"),顯示 Author: By XXX
    這樣的變化是利用 print (f"{}") ,加 f 後即可在字符串裡面使用花括號括起來的變量和表達式,如果字符串裡面沒有表達式,那麼前面加不加 f 輸出應該都一樣。
    來點範例:這是有無 f 的差異
    print(f"Author: {author.text}")
    #Author: By XXX
    
    print("Author: {author.text}")
    #Author: {author.text}
    
  • print(f"Page {page}, Author: {author.text}"),顯示 Page 1, Author: By XXX
    延續上面,這裡我們只是增加頁數,方便閱讀現在資料跑到第幾頁。
  • print(f"Page {page}, Index {idx + 1}. Author: {author.text}"),顯示 Page 1, Index 2. Author: By XXX
    這裡詳細顯示出,"第幾頁 第幾個 的作者是XXX"
    能這樣顯示第幾個索引值,功勞在此enumerate()

    enumerate() 迭代過程中同時獲取元素的索引和值。
    它通常用於循環遍歷列表、元組、字符串等可迭代對象,以便你可以同時訪問元素和它們的索引。
    可以是idx 或是 i 、position 都好 無論選擇什麼變量名,密名具有可讀性即可

    for idx, author in enumerate(author_infos):
            print(f"Page {page}, Index {idx + 1}. Author: {author.text}")
    

增添延遲時間效果 import time

也沒有一定要這樣做,只是過程中發現這樣的玩意,七頁資訊批哩啪拉一口氣吐出來,
添加import time & time.sleep()結尾可以看到每跑完一頁資訊就會停頓幾秒的效果。

import time 搭配 time.sleep()結尾
時間效果 => 請求之間添加一些延遲,以減輕伺服器的負載。
例如:伺服器反應時間不足:有時候,伺服器可能在請求太快或太頻繁時返回錯誤。
time.sleep(1),括弧內為秒數,這樣代表停頓一秒

小結

最終程式碼長相如下

import requests
from bs4 import BeautifulSoup
base_url = "https://astro.5xruby.tw/testimony/"

num_pages = 7
import time

for page in range(1,num_pages + 1):
    if page == 1:
        page_url = base_url  
    else:
         page_url = f"{base_url}page/{page}"  
    response = requests.get(page_url)
    response.encoding = "utf-8"
    
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, "html.parser")
    
        author_infos = soup.find_all("h4", class_="is-author")
        authors_per_page = 10
        for idx, author in enumerate(author_infos,1):
            print(f"Page {page}, Index {idx}. Author: {author.text}")
    else:
        print(f"Failed to retrieve page {page_url}")
    time.sleep(2)

https://ithelp.ithome.com.tw/upload/images/20230924/20150181WHmXoFoB73.png


上一篇
Day 5 . 欸 今天要幹嘛 - 我那個爬蟲有分頁欸!( python 靜態爬蟲)
下一篇
Day 7 . 欸 今天要幹嘛 - 索引值:切片(slicing)
系列文
待業不頹廢30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言