前言
這篇是我自己之前做「靜態網頁爬蟲」的筆記程式碼,
順便簡介一下靜態跟動態的差別,
- 靜態:可以當作是單純爬取 html
- 動態:有時會有與後端互動的網頁,純 html 無法處理到的部分
通常我們都可以對一個網頁按下右鍵「檢視網頁原始碼」,就可以看到網站原始的 html 了!
在「靜態網頁爬蟲」的主題中,我們使用的就是這個 html 進行搜尋
如果有找不到的內容,那很有可能就是「動態網頁爬蟲」的主題。
範例程式碼 (以爬我自己的網站為例)
之前有一個需求,我想要快速大量的取得我網站 leetcode 主題的所有標題,因此我就自己寫了一個爬蟲來爬我的網站。
但寫得比較複雜一點了,其實不是很適合新手學習,
而且使用的套件也不單純,我只是留這邊給我作為筆記使用XD
不過還是可以大概說明一下我在幹嘛:
- argparse:一個幫我處理 terminal 輸入的套件,有興趣歡迎在我網站搜尋 argparse 的用法,看完就會懂了。
(我也是拿我網站的範例去改出這支程式的)
- requests:處理網路、網頁相關的請求用
- BeautifulSoup:排版、取出特定 html 用,是當我們在拿回 requests 後好用的處理套件
(當然你懂了就知道,這個也可以不用,只是方便處理回傳的內容而已)
其他就不先多說明了,要用別人的程式碼前也要先做一點功課XDD,有些段落想用也請先想想在幹嘛,直接複製交作業,真的很容易就知道你是抄的了XDD (畢竟無關的段落太多XD)
import requests
from bs4 import BeautifulSoup
import argparse
def parse_args():
parser = argparse.ArgumentParser(prog='argparse_template.py', description='Tutorial')
parser.add_argument('-l', default="leet", type=str, required=False, help='leet or lint')
parser.add_argument('-c', default="py", type=str, required=False, help='py or cpp')
parser.add_argument('--nums', '-n', type=int, required=True, help='no')
return parser.parse_args()
def generate_string(url, language):
print(f"\nNow searching for: {url}")
response = requests.get(url)
# print(response)
soup = BeautifulSoup(response.text, "html.parser")
# print(soup.prettify()) # 排版後 html
result = soup.find("h1", class_="page-title")
# print(f"{result}")
print("find string: \n")
print(f"{result.text}\n")
if language == "cpp":
final_str = f"<a href=\"{url}\" rel=\"noopener\" target=\"_blank\">C++</a>"
else:
final_str = f"<a href=\"{url}\" rel=\"noopener\" target=\"_blank\">Python</a>"
# print(final_str)
return final_str
def input_problem_number(n):
if args.l == "lint":
problem_src = "lintcode"
else: # default leetcode
problem_src = "leetcode"
if args.c == "cpp":
language = "cpp"
else: # default python
language = "python"
url = f"https://www.wongwonggoods.com/python/python_leetcode/{problem_src}-{language}-{n}/"
return generate_string(url, language)
def main():
problem_number = args.nums
print(input_problem_number(problem_number))
if __name__ == '__main__':
args = parse_args()
main()