close

最近在公司真的覺得有點無聊

該說是適應不良還是不適合呢... 也不是三言兩語可以斷定的

大概就是氣氛比較養老吧,沒有什麼比較現代的開發流程,也沒有什麼新的feature可以做

然後那些舊的code又寫得很... 難以想像這是台灣知名軟體公司的code

不過說歸說,我也沒什麼辦法

既然沒辦法在工作上學習到東西,只能利用休息時間自學了

(再次驗證想進步還是要靠自己=ˇ=)

 

所以想說就來學個python爬蟲吧,爬一爬搞不好以後會有點用

我是用python3.6搭配jupyter來學的,因為之前有裝過就不用新的環境了

 

這個網路爬蟲嘛,其實基本的概念就是把網路上想要的資訊過濾出來

一般瀏覽器後面的行為其實就跟這些網路爬蟲差不多,只是瀏覽器會用各自的處理方式把資訊秀給你看

而從某部分來說,不是什麼資訊我都想要這樣,中間的處理過程也許也會耗費時間

網路爬蟲就可以減少這些消耗,拿到我們想要的資訊

 

先簡單介紹一個基本的library:urllib

這是python官方的library,其實有urllib和urllib2兩種(還有urllib3,但這個是第三方的,要另外安裝)

但在python 3.X的版本裡,urllib和urllib2已經合併成urllib了,所以基本不用太在意XD

 

基本上urllib就是處理url的各種網路相關的事務

比如說讀取和開啟url,處理error還有parse等等,算是爬蟲的基本使用library

當然第三方的library也很好用,比如說requests,用起來更加簡潔好用,也是一個選擇

 

就先用一個簡單的範例開始吧:

from urllib.request import urlopen
html = urlopen("http://www.ptt.cc/bbs/LoL/index.html")
print(html.read())

這一段code就是連向那個url的並且將回傳結果,當然印出來會是一堆xml格式的response,因為基本上沒有做任何處理

然後實際上上面的code會有403 forbbien error

 

這是因為有些網站為了避免爬蟲來獲取資訊,會對來存取的request有一些限制

比如說在header裡面沒有包含user agent資訊(包含瀏覽器、系統平台或是用戶等資訊),網站就不會允許存取

所以上面的code可以改成這樣:

from urllib.request import urlopen
from urllib.request import Request
req = Request("http://www.ptt.cc/bbs/LoL/index.html", headers={'User-Agent': 'Mozilla/5.0'})
html = urlopen(req)
print(html.read())

在request中加入需要的資訊,這邊是加上瀏覽器的資訊,就可以進行存取了

 

但如果是用requests的話,就不用這樣做了:

import requests

html = requests.get("http://www.ptt.cc/bbs/LoL/index.html")

這樣就可以得到一樣的結果

 

再來提一個解析的library,BeautifulSoup

這個library就是用來解析用的,可以快速方便的抓出我們想要的資訊

比如說上面的例子,我們想要抓出ptt lol版裡的title:

from urllib.request import urlopen
from urllib.request import Request
from bs4 import BeautifulSoup
req = Request("http://www.ptt.cc/bbs/LoL/index.html", headers={'User-Agent': 'Mozilla/5.0'})
html = urlopen(req)
bsObj = BeautifulSoup(html)
titles = bsObj.select("div.title a")
for title in titles:
    print(title.text)

這樣就會印出所有討論串的title

bsObj裡面就包含了解析出來的資訊,可以用select、find等等的function去得到你想要的資訊

 

這篇就是簡單的介紹記錄一下

下一篇會有比較多的應用,期待一下吧XD

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 頁頁頁六滴 的頭像
    頁頁頁六滴

    人森很精彩,所以要把所有事情都記起來=ˇ=

    頁頁頁六滴 發表在 痞客邦 留言(0) 人氣()