搜尋此網誌

2023年3月31日 星期五

python requests 抓取網頁

緣起:


    前幾天接到學長給我的一個小 mission,他說,他會給我網址的檔案,然後請我把那些網址對應的網頁給抓下來。目測 30 個左右,如果用工人智慧去一個一個抓的話,應該是不會花太久,但我有身為一位工程師的驕傲,所以打算寫個程式來做這件事。

    主要用到的東西就 Python requests、Python 檔案的讀寫、Python regex,尤其是這個 regex,一直忘,每次要實作都必定要查資料。真討厭。


程式需求:


    txt 檔,裡面是一行行的網址,幾乎都相同,不同的地方就數字那邊


    然後把網頁下載下來,存成 txt 檔,以該網址 epaper.html 前面的數字來當作檔名。


Python 檔案讀取:


    老實說,這東西我也是一直忘....,最好用的就 with + open 了。 第一個參數是檔名,第二個是模式,'r' 是讀取。


    再來使用 finput 的 readline 方法,取得文字檔裡的每列資料,他會回傳一個陣列,可以用 for in 來讀它。


    有學到一個 string 的方法,strip,它可以去除字串前面跟後面的空白,在把網址丟給 requests 前可以做一下這個預處理。


requests:


    超常用到的套件,用 pip 就能裝。用 requests 的 get 方法,裡面傳目標網址,用叧外一個 result 變數記住結果。


    result 有個 status_code,回應是 200 的話代表成功,再來可以透過 result 的 text 來拿到整個網頁的內容。result 會用到的地方就這樣了。


regex:


    python 有內建 re,import re 即可。在弄 re 時有看到一篇在講 greedy and lazy quantifiers 的文章,蠻實用的 (雖然最後沒用到就是)。我是想找出 /數字/ 部份,所以給 re.search 的字串是 r'\/\d{1,}\/',那個 r 代表 raw,很常跟 re 搭配使用。在 regex 裡面想配對 "/" 的話要寫成 "\/",因為 "/" 有特別用途。


    再來是把找到的字串抓出來,並去除 "/"。



codecs:


    如果就這樣直接寫入文字檔的話,就會有問題


    那個網頁的編瑪是 iso-8859-1,所以我後來就去找怎麼把 iso-8859 轉成 utf-8 的方法,最後找到的解答是,使用 codecs.open 跟字串的 decode、encode。寫完後,整個程式長這樣。





沒有留言:

張貼留言