這篇承繼同系列的

[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出來

 

arrow
arrow

    Markjong001 發表在 痞客邦 留言(0) 人氣()