Python 鐵人賽:遺珠之憾

最後一天,終於寫到這裡

第一次參加鐵人賽,很幸運的可以連續30天完成。甚至有些時候差點要超過時間完成不了鐵人賽
看了之前鐵人賽的文章,似乎過了一段時間在完成30天就會把挑戰第幾天凍結。(我也想要有鐵人煉成的成就啊~~

說真的這次給了我一個經驗,就是下次可能也要預先存幾個草稿好讓我可以之後準時發布
我覺得也感謝我這次參加鐵人賽的經驗,讓我有機會好好整理python的學習

總之,我來談談這次python鐵人賽沒談到的遺珠之憾吧
同時也是我之後會繼續專研的方向

  1. 基本與物件導向
  2. 多執行緒的議題
  3. 更深入的 Django和Flask
  4. 更深入的Pandas
  5. 關於機器學習/人工智慧:TensorFlow+Keras
  6. 其他爬蟲的框架:scrapy
  7. MapReduce 和 Spark 或Handoop

個人自己有看過的書籍而且覺得不錯
1)Python初學特訓班
2)Python 自動化的樂趣:搞定重複瑣碎&單調無聊的工作
3)Python新手使用Django架站的16堂課:活用Django Web Framework快速建構動態網站
不過這本架站的16堂課已經是舊版,如果要新版的請至此(Python新手使用Django架站技術實作:活用Django 2.0 Web Framework建構動態網站的16堂課)
https://www.books.com.tw/products/0010790747

個人推薦相關線上課程

  1. https://morvanzhou.github.io/
  2. Youtube
  3. Hahow 也有相關python的課程,我自己在上的有:「Python 網頁爬蟲入門實戰」和「用 Python 理財:打造小資族選股策略」

Python 資料科學:Pandas

今天來說說資料分析的python modules — pandas

首先我們來安裝他

pip install pandas

接下來我要介紹在pandas兩個資料結構 Series 和 DataFrame
他們的宣告很簡單,而且樣式也是很簡單,
首先是series

import pandas as pd

l = [1,2,3,56,7,7,73,3,3,2]

date = pd.date_range('20180731',periods=10)
s = pd.Series(l,index= date)
print(s)

print(s)接下來你就會看到

2018-07-31     1
2018-08-01     2
2018-08-02     3
2018-08-03    56
2018-08-04     7
2018-08-05     7
2018-08-06    73
2018-08-07     3
2018-08-08     3
2018-08-09     2
Freq: D, dtype: int64

所以series 很簡單,你可以想像成一個關係數列,然後之後我們可以藉由呼叫這個series的各種方法,如下

print(s.loc['20180731']) #因為index 是時間可以這樣呼叫=>1
print(s.loc['20180731':'20180802']) #因為index從2018-07-31到2018-08-02 的值
'''
2018-07-31    1
2018-08-01    2
2018-08-02    3
Freq: D, dtype: int64
'''
print(s.iloc[6]) #也可以用index喔(從0開始)-->73
print(s.iloc[5:7]) #iloc 最後一筆不算,所以會從5-6
'''
2018-08-05     7
2018-08-06    73
Freq: D, dtype: int64
'''
print(s.max()) #最大值 -->73
print(s.min()) #最小值 -->1
print(s.mean()) #平均值 -->15.7
print(s.std()) #標準差 -->26.106831800635376

還有其他的方法,請大家可以自行參考這裡。
https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.Series.html

再來,我要介紹關於dataframe的部分,dataframe簡單來說就是許多series組成的

import pandas as pd

date = pd.date_range('20181029',periods=3)
s1 = pd.Series([1,2,3],index=date)
s2 = pd.Series([4,5,6],index=date)
s3 = pd.Series([7,8,9],index=date)
df = pd.DataFrame() #empty dataframe
df = pd.DataFrame({'c1':s1,'c2':s2,'c3':s3})
print(df)

print df就會長得像這樣

import pandas as pd

date = pd.date_range('20181029',periods=3)
s1 = pd.Series([1,2,3],index=date)
s2 = pd.Series([4,5,6],index=date)
s3 = pd.Series([7,8,9],index=date)
df = pd.DataFrame() #empty dataframe
df = pd.DataFrame({'c1':s1,'c2':s2,'c3':s3})
print(df)

print df就會長得像這樣

            c1  c2  c3
2018-10-29   1   4   7
2018-10-30   2   5   8
2018-10-31   3   6   9

同樣的,他也和series支援很多方法

df.loc['2018-01-05']
'''
c1    2
c2    5
c3    8
'''

df.loc['2018-01-01':'2018-01-02',['c1','c2']]
'''
            c1  c2
2018-01-01   1   4
2018-01-02   2   5
'''

df.iloc[1:3,[2,1]]
'''
            c3  c2
2018-01-02   8   5
2018-01-03   9   6
'''

Python 網頁:Flask

寫到這裡真的覺得自己下次要參加鐵人賽要想清楚。 要規劃好內容,也可能自己要寫一些存擋備份(不知道那些完成鐵人賽的是不是都是這樣?)

不然有時候寫到後面,真的不是很想繼續寫下去、也覺得自己寫的內容有點爛XD

也或許自己寫的這個技術並不是自己最在行的,而是自己下班的閒暇之餘所寫的,所以如果有錯或者有什麼提供建議再精進的方向給我!

今天要介紹Flask
首先,就是要先安裝flask啊!

pip install flask

接下來建立我們的檔案 index.py

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "Hello World!"
if __name__ == "__main__":
    app.run()

最後我們執行index.py就會看到類似底下的訊息

* Serving Flask app "index" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

接下來輸入http://127.0.0.1:5000/ 到瀏覽器裏
就會看到Hello World 囉

Python 網頁:Django- 來做一個部落格(2)

今天,想把Django篇先結束XD

昨天,我們已經將post這個表註冊到後台並且已經migrate它
現在,我們要開始做前端的畫面並且能夠顯示。 這非常的陽春,如果需要更加深研的請歡迎自行搜尋

首先你會好奇為什麼在後台儲存資料卻是post object,原因是你沒有設定要顯示的什麼東西

所以在這裡請編輯models.py

from django.db import models
from django.utils import timezone

# Create your models here.
class Post(models.Model):
    title = models.CharField(max_length=200)
    slug = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.title

加入 _str__ 方法並回傳他要回傳的名稱這樣就可以在後台看到標題了

然後請編輯一下blog/urls.py

...(略)
from django.contrib import admin
from django.urls import path
from mblog import views

urlpatterns = [
    path('', views.homepage, name='homepage'),
    path('admin/', admin.site.urls),

]

將mblog/view.py引入,然後宣告首頁指向他

接下來編輯views.py

from django.shortcuts import render

from .models import Post

# Create your views here.
def homepage(request):
    posts = Post.objects.all()
    context = {
        'posts_list': posts
    }
    return render(request, 'homepage.html', context)

定義一個hombepage 方法,然後宣告他要傳的template 為homepage.html

最後請在mblog 裡面新建一個資料夾:templates,裡面有一個新檔案加入homepage.html

{% if posts_list %}
    <ul>
    {% for post in posts_list %}
        <li><a href="#">
            {{ post.title }}</a>
        </li>
    {% endfor %}
    </ul>
{% else %}
    <p>沒有文章可以顯示</p>
{% endif %}

這樣一個簡單的文章列表就會產生

此時我們的資料夾結構

./
├── blog
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   ├── settings.cpython-36.pyc
│   │   ├── urls.cpython-36.pyc
│   │   └── wsgi.cpython-36.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── db.sqlite3
├── manage.py
└── mblog
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-36.pyc
    │   ├── admin.cpython-36.pyc
    │   ├── apps.cpython-36.pyc
    │   ├── models.cpython-36.pyc
    │   └── views.cpython-36.pyc
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   ├── 0001_initial.py
    │   ├── __init__.py
    │   └── __pycache__
    │       ├── 0001_initial.cpython-36.pyc
    │       └── __init__.cpython-36.pyc
    ├── models.py
    ├── templates
    │   └── homepage.html
    ├── tests.py
    └── views.py

Python 網頁:Django- 來做一個部落格(1)

昨天我們已經建立好部落格的大概專案結構,如下

├── blog
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   ├── settings.cpython-36.pyc
│   │   ├── urls.cpython-36.pyc
│   │   └── wsgi.cpython-36.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── db.sqlite3
├── manage.py
└── mblog
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

接下來我們就來快速建立一個部落格吧

首先,我們主要work的資料夾都會在我們藉由startapp為起始的mblog資料夾內
在models.py裡面做編輯,加入一個posts的表

from django.db import models
from django.utils import timezone

# Create your models here.
class Post(models.Model):
    title = models.CharField(max_length=200)
    slug = models.CharField(max_length=200)
    content = models.TextField()
    pub_date = models.DateTimeField(default=timezone.now)

然後請記得在blog全站設定的資料夾裡面的setting.py加入一行’mblog.apps.MblogConfig’
如下所示

(略)...
INSTALLED_APPS = [
   'mblog.apps.MblogConfig', #加入這一行,將mblog的設定加入
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
]
(略)...

然後就是

python manage.py makemigrations
python manage.py migrate

django預設的資料庫就是他底下的db.sqlite3
用資料庫的工具打開它你就會看到你的post表(mblog_post)在裡面了。

另外,Django厲害方便的地方是自帶後台,
請在mblog資料夾下的admin.py編輯

from django.contrib import admin

# Register your models here.
from .models import Post

admin.site.register(Post)

將post 表註冊進入admin中,然後利用

python manage.py createsuperuser

這個指令創建後台使用者,
然後

python manage.py runserver

就可以進後台(記得在網址後面加入admin)無痛開箱使用post表囉

明天來講講怎麼使用前端的部分還有引入markdown的部分 就結束django這個旅程吧

Python網頁篇:Django- 簡介

今天講點關於django概念上的東西

首先Django 的MVC不是傳統上的MVC ,而是MTV
M- model.py
T- templates
V- View

詳細介紹可以參考此網址:
http://mropengate.blogspot.com/2015/08/mvcdjangomtv.html

而今天要架一個blog的網站,首先django有趣的是他有一個初始專案開啟的資料夾以外,還有一個專門放網站設定網站程式的資料夾。所以我們要撰寫用django 架設 blog時還要再下一個指令

python manage.py startapp mblog
#mblog 你可以用任何的名稱,只要不要和你本身目錄衝到

這時我們來看看目前程式資料夾的架構

├── blog
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   ├── settings.cpython-36.pyc
│   │   ├── urls.cpython-36.pyc
│   │   └── wsgi.cpython-36.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── db.sqlite3
├── manage.py
└── mblog
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

覺得很多嗎? 不用擔心,其實我們改動的很少….大概很快我們就能用Django寫出一個部落格了

Python網頁篇:Django- 初始環境

現在開始來講用python開發網頁,
這一篇到後面幾篇來講講用Django 架設一個用markdown寫作的部落格。

也藉著這個範例來說明一下django.

首先,當然是要先安裝好django啦!

pip install django

然後要創建一個django的專案請使用

django-admin startproject {專案名稱}
#我這裡就是專案名稱為blog
django-admin startproject blog

你的資料夾結構如下

blog
├── blog
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

接下來到blog的資料夾(或者你專案的資料夾下),使用

python manage.py runserver

接下來會出現一個網址,像我的訊息就是

Performing system checks...

System check identified no issues (0 silenced).

You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

October 24, 2018 - 14:12:00
Django version 2.1.2, using settings 'blog.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

接下來你只要在瀏覽器key上http://127.0.0.1:8000/ 就看到django的初始頁啦
接下來我們一起好好研究Django吧!

Python 走入現實:json

今天來講怎麼用python怎麼讀取json.

json 是一個資料表示的型式。
以範例來看:

import json

# json 的資料形式字串
x =  '{ "name":"jim", "age":25, "city":"Taiwan"}'

# 轉換json
person = json.loads(x)

print(type(person)) #<class 'dict'>
print(person){'name': 'jim', 'age': 25, 'city': 'Taiwan'}
print(person['age']) #25

要讀取json非常簡單,import json這個module
然後經由loads這個方法轉出,會產生一個dictionary型態資料

接下來,是反過來~把python的物件轉換成json,則使用dumps方法

import json

person = {'name': 'jim', 'age': 25, 'city': 'Taiwan'}

data = json.dumps(person)

print(type(data)) #<class 'str'>
print(data) #{"name": "jim", "age": 25, "city": "Taiwan"}

Python 走入現實:selenium+爬蟲

昨天介紹了selenium 這個module
今天來加強版,讓selenium 和beautifulSoup結合為一

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup

url ='https://tw.yahoo.com/'

#今天講個特別的,我們可以不讓瀏覽器執行在前景,而是在背景執行(不讓我們肉眼看得見)
#如以下宣告 options
options = webdriver.ChromeOptions()
options.add_argument('--headless')

#打開瀏覽器,確保你已經有chromedriver在你的目錄下
# 然後將options加入Chrome方法裡面,至於driver請用executable_path宣告進入
browser=webdriver.Chrome(chrome_options=options, executable_path='./chromedriver')
#在瀏覽器打上網址連入
browser.get(url) 

#這時候就可以分析網頁裡面的元素
element = browser.find_element_by_id('UHSearchBox')
element.send_keys('Hello World')

sumbit = browser.find_element_by_id('UHSearchWeb').click()

# 等待目標表格'id 為 web'的div出現
element = WebDriverWait(browser, 5).until(
    expected_conditions.presence_of_element_located((By.ID, 'web'))
)

#然後就是beautifulsoup的範疇了,將browser.page_source放進去分析
soup=BeautifulSoup(browser.page_source,"html.parser")
links = soup.select('div#web h3')

for link in links:
    print(link.get_text())

browser.quit()

接下來就會印出 yahoo搜尋 hello world的搜尋結果標題們了,撒花~~

Python 走入現實:selenium

今天來介紹一個特別的module: selenium
他是一個可以控制瀏覽器的module.

但如果你要控制瀏覽器載入這個module以外也要在下載相對應瀏覽器的driver還有相對應作業系統的版本,

我這裡以我自己作業系統為mac os 還有 瀏覽器的driver設定為我個人最常用的‘chrome’為例
如果你是其他os或者要弄其他的瀏覽器,請造訪
https://selenium-python.readthedocs.io/installation.html

啊如果還是看不懂歡迎在底下留言討論。

先上範例程式碼:
這裏我是用yahoo的網址然後在搜尋框打上hello world 並且做搜尋

from selenium import webdriver

url ='https://tw.yahoo.com/'

#打開瀏覽器,確保你已經有chromedriver在你的目錄下
browser=webdriver.Chrome('./chromedriver')
#在瀏覽器打上網址連入
browser.get(url) 

#這時候就可以分析網頁裡面的元素
element = browser.find_element_by_id('UHSearchBox')
element.send_keys('Hello World')

sumbit = browser.find_element_by_id('UHSearchWeb').click() 

關於selenium 你可以更多看文件:
https://selenium-python.readthedocs.io/index.html

接下來執行你就會很清楚的發現電腦另立一個新的chrome,然後坐著我們想要做的事…

這樣的工作可以做什麼?可以延伸什麼?
1.表單填寫:例如如果電子連署我可以大量搞死人連署(大誤XD
2.軟體工程師的網頁測試
3.可以和beautifulsoup搭配,天底下已沒有你爬不到的資料XD
4.其他你覺得用瀏覽器很麻煩的動作