創用 CC 授權條款
除非另有註明,本網站的著作Fygul Hether製作,以創用CC 姓名標示-非商業性-禁止改作 4.0 國際 授權條款釋出。
顯示具有 Python 標籤的文章。 顯示所有文章
顯示具有 Python 標籤的文章。 顯示所有文章

2019年12月14日 星期六

以Python與無頭式Firefox或Chrome做網頁抓取

前言

以程式來抓取網頁內容從中取得有用資料的工作早已不是件困難的事,而現代網頁的產生方式也有許多種方式,其中一種是執行過JavaScript才產生的。這類網頁在程式中僅由一般取得靜態網頁的方式來取得是行不通的,必須透過像瀏覽器的運作,執行過其中的JavaScript後,真正的網頁內容才會產生。

若要以Python抓取由JavaScript所產生的網頁內容,有一種作法是透過Selenium[1],驅動瀏覽器來進行。Selenuim支援多種瀏覽器,其中包含了Firefox, Google Chrome。但在某些應用的環境中,啟動瀏覽器來抓資料可能不太適合,因為桌面環境就不方便同時再進行其他工作,或是根本沒桌面環境可用。在這種情況下,像PhantomJS這類無需圖形環境的Scriptable Headless Browser[2],無頭(意指沒有圖形畫面顯示)的瀏覽器就相當適合,而Selenuim也支援它。以往PhantomJS在這方面使用的領域佔有重要的一席之地,自己也用了很長一段時間,且得心應手。只是Selenuim後來的版本因某些因素不再支援它,想用Headless瀏覽器,得改用其他像Firefox Headless Mode或是Chrome Headless Mode。

本文簡單記錄Python中以Selenuim驅動Headless Firefox/Chrome的方式、幾點相關建議、提醒以及相關參考。不涉及Selenium與Headless Browser之詳細用途說明,這類請查閱後面所列的參考。內容僅屬粗淺的入門指引,也算不上教學文,文末所列的參考可查到這方面詳細資料。

本文適合的讀者對象是已經會使用Python來抓取一般網頁,但對於以JavaScript或Ajax所產生的網頁資料一籌莫展者。要做這工作,最好熟悉HTML,能懂點JavaScript更好,會使用瀏覽器的開發者工具來檢視HTML元素可方便鎖定想找的東西,以及瀏覽器主控台。

如果想學習如何以Python抓取網頁資料(俗稱網路爬蟲),市面上已有數本這類書籍,像Web Scraping with Python。有Python基礎者可利用Requests, Beautiful Soup, lxml(選項)的組合,或者Scrapy來達成一般的網頁抓取工作,前者的組合可做一般應用也可做爬蟲,較容易入手;Scrapy則專門用於建構爬蟲。在必要時才採用本文所說的方式來抓取由Javascript產生的網頁資料。

2019年9月11日 星期三

pipenv使用例

摘要

本文以一假想情境來說明pipenv的使用方式。環境是Ubuntu 18.04,使用pipenv建立虛擬環境,安裝Python 3.7.4與需要的包。

本文涉及以下軟體工具的使用,必要時可先稍了解一下其作用:

假想情境簡介

假定想在Ubuntu 18.04(系統用的Python 3版號是3.6.x)安裝使用Python 3.7.4,但又不想干擾到系統用的Python版本。於是另行建立Python虛擬環境,在其中使用Python 3.7.4,之後在此虛擬環境中安裝想要的Python包。

假定在開發期間需要用到pytest寫測試,且寫CLI軟體要使用到docopt包,這裡假定寫好的程式是naval_fate.py。借用此範例程式內容不是本文的重點,這裡只為了方便展示。

2019年9月9日 星期一

pipenv簡單使用

摘要

本文是pipenv文章系列的第二篇。標題稱“簡單使用”也許不切題,可能會有人覺得內容並不是很簡單。總之,算是入門的文字,請自動略過感覺過深的部分。以下正文開始。

pipenv可整合pip, virtualenv與pyenv的使用,大幅簡化建立Python虛擬環境的工作方式。它會是廣泛採用的方式。

Pipenv功用

  • 可高度整合pip, virtualenv, pyenv的功能,將虛擬環境的建置與包(package)安裝、升級等維護之繁雜工作簡化。
  • 若有pyenv,可藉著它來自動安裝所需要的Python版號(限CPython版,且不支援3.8-dev之類版號)。
  • 可自動記錄、維護並區分開發/產品環境所需要的不同包。不再需要維護requirements.txt這類記錄。
  • 可檢查虛擬環境與包的軟體安全漏洞。
  • 可顯示包的依賴關係。
  • 若有.env檔,可從中自動帶入環境變數。
  • pyenv install語法與pip install的完全相容。

2019年9月8日 星期日

pyenv簡單使用

本月打算發布與pipenv相關的文章,由於內容稍多,所以安排分成三篇:
  1. pyenv簡單使用
  2. pipenv簡單使用
  3. pipenv使用例
這些內容是從之前撰寫的內部文件節錄出來並做調整,也許不詳盡,但文後會有參考連結可供讀者查閱原始說明文件。

因使用pipenv時也可能會使用到pyenv,所以把pyenv擺在前面,不過閱讀時不盡然要照此順序。若是時間有限,也可先看第三篇,先有個較全面的概觀,必要時再回頭看前二篇較細部的使用與解釋。

以下是第一篇內容。

pyenv簡單使用

摘要

pyenv會下載Python源碼來編譯並安裝。採用這樣的做法會比像〈Ubuntu 14.04安裝Python 3.5〉所提到的作法來的簡單,也不干擾到系統用的Python版本。

本文展示環境是Ubuntu 18.04,使用bash。

pyenv功用

pyenv工具程式用來安裝、管理與使用多個Python版號。
  1. 可輕易在多個不同Python版號之間做切換。
  2. 允許以環境變數來改變想用的Python版號。
  3. 支援個別專案指定的Python版號。
  4. 純粹由shell scripts製作,與shell結合使用(不是給Windows用的,Windows上另有pyenv-win可用,不在本文討論範圍)。

2019年2月20日 星期三

2018年Python開發者調查結果

PSFJetBrains在2018年秋季進行了第二次的年度Python開發者調查,有來自逾150個國家超過2萬名開發者參與。此調查結果可看出Python社群的近來情景與在2018年Python開發界的最近趨勢,也可與2017年的調查結果做比較。完整的調查結果請見原始文章,本文只從中大略挑選部分要點。為方便說明,本文大致按照原文的區段標題來分段。

2018年1月1日 星期一

sqlacodegen: Automatic model code generator for SQLAlchemy

使用SQLAlchemy時,需要自行編寫個models.py,其中是資料表格的定義,若資料表格很多,就要寫不少東西。

如果懶得自己寫代碼,可先用資料庫的圖形管理軟體定義好所要的資料庫結構之後產生一個實際的資料庫,再利用sqlacodegen從這資料庫產生models.py。例如使用SQLite資料庫,可利用像〈四款SQLite圖形界面管理軟體〉之類的工具,產生所要的資料庫。

也就是若有既有的資料庫,sqlacodegen會讀取即有資料庫的結構,自動產生SQLAlchemy用的models.py代碼。

本文簡單介紹sqlacodegen的使用。

2017年12月29日 星期五

SQLAlchemy: Python SQL toolkit and Object Relational Mapper

在使用了Python之後,最先採用的資料庫是SQLite,Python標準庫的sqlite3提供了SQLite資料庫界面,使用上算相當方便,效率也不差。但為了方便將來轉換到PostgreSQL,漸採用SQLAlchemy,它是Python用的SQL工具與ORM (Object Relational Mapper)[1] 。

採用ORM連結資料庫有個好處是,所做的程式在往後若採用不同的資料庫軟體時,資料庫的連結方式無需做大幅度調整。SQLAlchemy支援了多種主流的關聯式資料庫。

雖然SQLAlchemy有相當好處,這裡還是要提醒一點,當資料量很大時,透過ORM存取資料的效率通常不像使用專用資料庫API來的好,譬如前述的SQLite資料庫為例,從sqlite3換成SQLAlchemy後在一次處理大量資料時就會感覺到效率上有點差異。 一般前端應用上的作法通常也不會寫成讓使用者一次調用大量資料, 這類一次調用大量資料的情景,通常像在後端做轉換或匯出/匯入資料,而此時可能會想用其他較合適的方式了。

以下用簡單的例子粗淺的介紹SQLAlchemy的入門使用方式。

2017年11月26日 星期日

Python logging模組

在某些情況,在Python程式中要對程式的執行狀況做些記錄,比如排程在凌晨三點執行下載某種資料的程式,程式若只是把執行狀況的資訊顯示在螢幕上,若程式結束,這些資訊就不見了。像這時候較好的作法是把這些資訊存到記錄檔中。Python標準庫中的logging模組在這方面提供了相當方便的途徑,只需做個簡單設置,簡單幾行代碼就可以解決。

以下以簡單的例子說明logging模組的簡易用法。

2017年11月20日 星期一

以Python修改檔案的建立日期與時間

Python zipfile模組之二〉提到如何修改檔案的修改與存取時間,本文則展示在Windows下如何以Python修改檔案的建立時間。

這裡要先說明的是,各種作業系統與檔案系統的設計有所不同(如POSIX標準的定義中並無建立時間),這個檔案建立日期時間是Windows中才有的,所以以下的範例代碼僅用在Windows平台。Python也要先裝好pywin32 (Python extensions for Windows)才行。

另外一個提醒:有一些免費的Windows軟體已提供了修改檔案建立/修改/存取日期時間的功能,像BulkFileChanger。如果不是特別複雜的情況,通常這類工具就夠用了,不必自己寫。

2017年11月16日 星期四

Python zipfile模組之二

本文繼〈Python zipfile模組〉之後再談一下zipfile的解壓縮工作。前述那篇的解壓縮只簡單提到extractall(),這用法雖然簡單,但所解壓出來的檔案,它們的檔案修改日期會與原本在壓縮檔中的不同。如果在意這一點,那麼就必須在解壓完成後自行做修改,而這也是本文所要談論的內容。

以下就直接拿一個實際情境當範例來做說明。在此例中,在一個目錄中有許多zip壓縮檔,每個壓縮檔中包含數個檔案,每個壓縮檔在解壓縮時要把其中的檔案放到各自的目錄中,這各自的目錄就以壓縮檔的主檔名做為名稱。解壓縮時要取得每個檔案的修改時間 ,解壓縮完成後就以這時間來設定檔案的修改/存取時間。

2017年10月28日 星期六

Python zipfile模組

zipfile是Python內建標準庫提供做壓縮與解壓縮用的。

它目前不支援多磁片壓縮,支援加密ZIP的解密,但尚不支援加密。壓縮方法有保存(無壓縮), PKZIP, BZIP2, LZMA 。雖然功能並不算很齊全,但可以應付大多數的使用情況,而且它的使用方式也相當簡單。

本文簡單展示zipfile的部分用法。

2017年9月24日 星期日

Python csv模組

本文簡單展示Python內建準標函式庫中csv模組的用法。

以下範例採用一個從臺灣證券交易所網站下載的實際csv資料檔,從中取得當日ETF交易資料,把需要的欄位資料另存到一個csv檔案。即簡單的csv讀取與寫入的作法。

2017年8月27日 星期日

Python讀寫試算表檔案

在某些情況,需要從試算表檔案中讀取資料,或是把資料存入試算表中,Python有一些package包可以很方便的把這類工作做好。這類試算表檔案,較流行的有MS Excel的.xls或.xlsx以及Open/Libre Office Calc的.ods格式。因為Python包可以良好的處理它們,所以這裡就不花時間去探討它們的檔案格式。

網路上的一些公開資料,若是試算表檔案,通常以.xls居多。而Libre Office這免費的自由軟體取得容易,Calc的使用也類似Excel,是最佳的辦公室軟體套件。這裡就以讀取.xls與寫入.ods為例。

會用到二個package,記得要先用pip安裝xlrdrelatorio。閱讀本文者除了要稍有Python基礎,也要知道Libre Office Calc的簡單使用方法,以下例子中會用到插入超連結的操作。

2017年7月29日 星期六

configparser:Python的設置檔解析器

有時我們寫了某個程式,希望它啟動後讀取一些程式的設置,或是程式結束之前儲存某些資料,譬如程式的狀態,以利下回程式啟動時可以取用。在Python這類儲存程式設置或狀態的作法可有幾種現成的選擇,pickle, JSON, shelve或是configparser。如果希望設置檔中的內容可方便人工編輯與人眼閱讀,就像Windows上使用的.ini檔那般,那麼configparser是最好的選擇。

Python標準函式庫中的configparser模組有個ConfigParser類別,可方便對.ini檔內容的操作,以下就用一個簡單範例做說明:

2017年6月24日 星期六

一些常用的Python 3rd Party Packages

Python除了自身的標準函式庫以外,還有廣大使用者社群提供的package,這些多數可在PyPI上找到。以下列表是自己較常用的其中一部分,做個粗略的分類:

Office類

  • relatorio:輸出資料到Open/LibreOffice檔案。
  • xlrd:讀Excel檔案內容。
  • xlwt-future:寫入資料到Excel檔案。

網路類

  • requests:HTTP函式庫,堪稱設計典範。改用它之後,都快忘了標準庫中的urllib怎麼用了。
  • selenium:Python language bindings for Selenium WebDriver.
  • Django:Python Web framework

2017年6月16日 星期五

cx_Freeze:打包Python程式的利器

若要把Python開發好的應用程式交到用戶端使用,通常要在用戶端安裝Python執行環境,以及所用到的package,這工作若交由一般使用者進行,可能會有些挑戰性。一種變通的方式就是把Python腳本轉成.exe執行檔,連同用到的Python執行環境與package一起打包好,交給使用者,使用者無須煩惱前述的安裝工作,只要會啟動這些執行檔即可。

這類把Python程式打包成執行檔的工具有幾種不同選擇,這裡只談其中之一的cx_Freeze,因為它使用上較為簡單,而且支援多種平台,本文的範例則是用在Windows平台。

cx_Freeze是一套腳本與模組,用來將Python腳本凍結(freeze)成執行檔,就像py2exe與py2app所做的。與這二者不同的是,cx_Freeze是跨平台且可在Python本身可運行的任何平台上運行。它需要Python 2.7或以上版本,且可用在Python 3。

cx_Freeze除了有可把腳本程式凍結成執行檔的功能,也有建立安裝程式的功能,但本文只談前者,因為後者有其他更進階的工具可以辦到。我自己的作法是使用cx_Freeze把程式凍結成執行檔後,再使用Inno Setup製作安裝程式。

2017年2月12日 星期日

Python數據分析的利器

近年來大數據趨勢的興起,讓數據分析、資料科學、機器學習這類領域成為熱門的潮流,一些適合這方面的語言或軟體像Julia、MATLAB/GNU Octave、Python、R、SAS、Scala也隨之更為流行。本文無意在這些不同軟體或語言之間做優劣比較,不同的軟體、語言之間各有其強弱項與突特之處,使用者應以自身的需求從中做選擇,筆者也只用過其中三種,也不適合寫這類比較文章。

前陣子發現有人以R語言七種武器來做為訓練課程或工具名稱的名稱,來代表R語言工具的使用技能。而這篇〈Python的七种武器_Python有哪些数据分析模块〉以及自己近期工作上的使用情況則激發了產生本文的靈感。

如果看倌是位武俠迷的話,應當會知道七種武器這名稱乃源自古龍武俠小說中的七種武器系列:長生劍、孔雀翎、碧玉刀、多情環、霸王槍、離別鉤、一口箱子。雖然第七種武器有其他二種說法:拳頭或是七殺手,但綜合各方面的因素看來,還是《英雄無淚》中的一口箱子較為合適。

Python不僅是個一般用途的語言,它在加裝幾個套件或模組後,就可立刻搖身一變成為數據分析的強大武器,一點也不遜色於主要為統計分析而打造的R語言,或是像MATLAB、SAS這類知名且歷史悠久的商業軟體。以下就介紹幾個能讓Python成為數據分析變形金剛的擴充套件:

2016年12月18日 星期日

Python編輯器PyCharm的入門簡易使用

在自己實際用過與試過的眾多Python編輯器中,PyCharm無疑是最好用的一個,尤其對於初學者來說,它好用的提示功能可協助初學者減少犯錯,在初學階段能順利些。PyCharm有專業版與社群版,不論哪個版本,功能都相當多,對於初學者而言,可能會有面對超級工具卻不知如何入門的冏境。

這裡簡介社群版中對於初學者而言,簡單與夠用的一些功能供參考。那些進階功能,有些暫時用不著,以後再去慢慢了解即可。

以下使用的環境是Ubuntu Mate 16.04, Python 3.5以及PyCharm Community Edition Version 2016.3.1。還需要Java環境來執行PyCharm。PyCharm並無中文介面,以下說明中在必要時會加入中譯詞。(我發現有人做了簡體中文語言包,但不一定適用在最新版本上。)

PyCharm的更新算是相當頻繁,也不見得要一見新版釋出就去更新,有時會有局部更新,有時改動較大就要下載整個新版檔案換裝。這裡不詳述安裝過程的細節,因為PyCharm的網頁上就有安裝的指示。也不談社群版與專業版的差異,這些在官網上都查得到,這裡只純粹談簡易的使用,也不涉及操作細節。

2016年12月3日 星期六

建置Django應用程式的運行環境

本文提要

可運行Django應用程式的技術堆棧有很多樣的選擇,這裡採用的組合:
  • OS: Ubuntu Server 14.04
  • Web Server: Apache + mod-wsgi
  • Database: PostqreSQL或是SQLite
  • Python: 3.4
  • Django: 1.8
以下假定要在個人家目錄下建立Python虛擬環境,在其中建立新的Django專案。當然如果已有現成合適可用的Python虛擬環境與Django專案,直接複製即可。

以下也假定已安裝好PostqreSQL Server,就不花巨大篇幅解釋這方面的設置,以及Apache或Python虛擬環境的詳細使用,這些寫在別處。這裡僅寫與Django直接相關的部分。

只是簡單的範例,應視實際情況做修改。