準備來優化這幾天搭建起來的 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}")
,看起來是全部都有,
但變成需要很不智慧的一個個數,我們就來動點手腳吧
是說最原本一開始是寫 print(author.text)
這樣而已
for author in author_infos:
print(author.text)
下方三種,優化演變過程
print (f"{}")
,加 f 後即可在字符串裡面使用花括號括起來的變量和表達式,如果字符串裡面沒有表達式,那麼前面加不加 f 輸出應該都一樣。print(f"Author: {author.text}")
#Author: By XXX
print("Author: {author.text}")
#Author: {author.text}
enumerate()
enumerate()
迭代過程中同時獲取元素的索引和值。
它通常用於循環遍歷列表、元組、字符串等可迭代對象,以便你可以同時訪問元素和它們的索引。
可以是idx 或是 i 、position 都好 無論選擇什麼變量名,密名具有可讀性即可
for idx, author in enumerate(author_infos):
print(f"Page {page}, Index {idx + 1}. Author: {author.text}")
也沒有一定要這樣做,只是過程中發現這樣的玩意,七頁資訊批哩啪拉一口氣吐出來,
添加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)