這篇承繼同系列的
[Python來爬蟲系列文1 ]觀察我們要爬的網頁("以股價資料為例")
請先看看裡面的內容 再過來看這篇喔
再次強調爬文的藝術博大精深
新手小白只是用我認為最簡單的方式來做而已
這篇要講得是怎麼用python 來實現 上篇的內容
首先 必須要有 requests 這個套件
(如果是用Anaconda應該已經幫你灌好了,如果不行請再下方留言吧)
import requests ## 先把套件 載入
## 然後我們使用 requests.get (' 你想下載的網址 ') 就可以把網頁內容載下來囉
response = requests.get('http://www.twse.com.tw/exchangeReport/MI_INDEX?response=csv&date=20180820&type=ALLBUT0999&_=1534745211834')
response.text ## 可以把檔案叫出來
和上一篇的內容是一樣的呢~~
接下來就是整理我們載下來的這些文字了
還記得 上次新手小白是用EXCEL打開的
並且手動把一些不需要的東西刪掉
但我現在用的是Python... 沒有辦法像EXCEL這樣直觀
現在的目標是把這些文字 弄成一個dataframe
首先第一步呢 我們要讓這些文字做換行
## 可以使用 split 這個函數 可以把文字做切割成不同行
## \n 還記得吧~~ 是換行的意思
## 所以我們依著本來網頁的寫法 做換行的
lines = response.text.split('\n')
print(lines[1])
print(lines[100])
print(lines[300])
大家可以發現到
1. 它真的按我們希望的分行了~
2. 第1行 第100行 第300行 的欄位個數不同?
那哪一個才是我們想要的呢~
因為我們要的是股價 所以應該是 300 行的那個欄位數喔
仔細算一下 是17欄~~
所以我們還可以寫一個for loop來把這些行找出來
方法如下:
newlines = [] ## 定義一個我真的想要那些行
for line in lines:
if len(line.split('",')) == 17: ## 用「",」切欄位 看是否為17欄
newlines.append(line) ##還記得append吧~將 line 加到新的 newlines 中
好啦~~最後離我們的DataFrame已經不遠了
新手小白就嘗試用一句code來做出DataFrame吧
df = pd.read_csv(StringIO( '/n'.join(newlines).replace('/n=','') ) )
df.head()
##整理出來的結果已經算很不錯囉~~
##如果有想要再怎麼做處理的話 新手小白會再試試
##這邊用到的 幾個函數提一下
## StringIO ~~~ join~~~ replace~~~
## 這邊用的 '/n'.join 就是把前面整理好的list 用 '/n' 串起來 這樣之後read_csv 就會看成一行一行的
## replace 需要兩個變數 replace('/n=','') 就是把 '/n=' 這種怪怪的東西 用 '' 取代
## '' 表示沒有東西 所以用 '' 來取代 就是刪掉的意思
文章的最後會補充一下 StringIO 的介紹
StringIO的補充:
StringIO 的用途是 讀寫 我們內存的文字(而不是去讀一個檔案)
使用方法如下:
import pandas as pd
from io import StringIO ##讀入StringIO
qq = StringIO() ##定義一個內存文字
qq.write("安安") ##寫入文字
qq.write(", 我是新手小白~~我們下次見!!!") ##接著要往下寫
print(qq.getvalue()) ##用getvalue 拿出內存文字並print出來
留言列表