python爬蟲自動下載網頁連結
阿新 • • 發佈:2018-11-26
需求分析
今天遇到一個簡單的需求,需要下載澳大利亞電力市場NEM日前市場的發電商報價資料(http://nemweb.com.au/Reports/Current/Next_Day_Offer_Energy/),頁面觀感是這樣的:
Ctrl + F 一下,看到一共有395個zip連結。於是就想著用python爬蟲自動下載。這個網頁很簡單,沒有驗證碼,甚至不需要登入,因此自動下載的python程式碼也很簡單。
步驟
爬取連結主要是如下3步:
1. 第一步是爬取網頁內容,儲存在一個字串content中
content的觀感是這樣的
從中可以看到連結是以'PUBLIC_NEXT_DAY_OFFER_ENERGY_(\d*)_(\d*).zip'的形式出現的,而且出現了兩遍。
2. 第二步是構造正則表示式,從content中匹配下載連結
正則表示式構造為'(PUBLIC_NEXT_DAY_OFFER_ENERGY_(\d*)_(\d*).zip)',re.findall會返回一個三元tuple,分別是 (整個匹配到的字串,第一個(\d*),第二個(\d*)). 由於上面提到了連結出現了兩遍,所以可以用list轉set來去重。
3. 第三步是遍歷連結的set,下載連結
這一步就很trivial了,唯一要注意的是如果下載下來的檔案所在的目錄不存在,要提前作判斷,建新目錄。
結果
Done!
原始碼
""" Created on Tue Nov 20 09:50:26 2018 @author: weiyx15 Automated downloading all data links from http://nemweb.com.au/Reports/Current/Next_Day_Offer_Energy/ """ import urllib.request# url request import re # regular expression import os # dirs # parent url url = 'http://nemweb.com.au/Reports/Current/Next_Day_Offer_Energy/' # regular expression pattern = '(PUBLIC_NEXT_DAY_OFFER_ENERGY_(\d*)_(\d*).zip)' # pull request headers = {'User-Agent', 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'} opener = urllib.request.build_opener() opener.addheaders = [headers] content = opener.open(url).read().decode('utf8') # match regex and drop repetition raw_hrefs = re.findall(pattern, content, 0) hset = set(raw_hrefs) # make directory if not os.path.exists('./auto_download'): os.makedirs('auto_download') # download links for href in hset: link = url + href[0] print(link) urllib.request.urlretrieve(link, os.path.join('./auto_download', href[0]))