1. 程式人生 > >python爬蟲自動下載網頁連結

python爬蟲自動下載網頁連結

需求分析

今天遇到一個簡單的需求,需要下載澳大利亞電力市場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]))