python3 web crawler 網路爬蟲教學 – 安裝與使用

python3 是網路爬蟲最好的選擇

此教學為 python3 的網路爬蟲教學

我們已爬 http://store.steampowered.com 的價格為例

爬蟲的用處很多
例如一個網站沒有提供 API 的情況下,我們可以以爬蟲去取得一個網站的資訊
甚至在其他的程式語言中呼叫 python 來儲存爬回來的資訊
再以圖表來分析使用者行為

此篇文章將一步一步將使用者帶入爬蟲的世界

1. 安裝

安裝:https://www.python.org/downloads/release/python-351/

*請注意,因本篇是以 python3 所寫的,因此 python version 2.x 是不適用的。

安裝後務必確認您安裝的版本沒有錯請於 command line 輸入

 $ python

若你發現你的 command line 是出現2.7版本,那可能代表你並未安裝完成或是你輸入錯指令了
備註:Mac OS X 與 Ubuntu 14.04 預設就會安裝 python2.7 的

螢幕快照 2016-05-11 下午1.01.09

試著輸入 python3

 $ python3

如果你輸出如下圖所示,那恭喜您,你已經成功安裝 python3 了!
螢幕快照 2016-05-11 下午1.00.49

2.安裝 pip3

在開始之前,因為會需要用到一些 Library
因此得先 pip3 這個工具來讓我們更好獲取這些資源

在 Debian and Ubuntu 安裝  pip

$ sudo apt-get install python3-pip

Mac OS X 安裝 pip

$ curl https://bootstrap.pypa.io/ez_setup.py -o - | sudo python
$ sudo easy_install pip

3.安裝所需 python3 Library

在安裝 pip3 後,便可以輕易利用 pip3 這個工具取得 所需的 Library,在這個範例中我們會需要兩個外部的函式庫 OptionParser 與 BeatifulSoup

$ sudo pip3 install optparse-pretty
$ sudo pip3 install BeautifulSoup4

4. 觀察目標網站

當我們已經準備好所有工具以後我們開始觀察目標網站
這次我們的目標是 Steam 平台

我們舉個例子吧!
今天假設你是一個遊戲內容供應商
你想讓使用者知道 Steam 上的當日遊戲所有價格內容
或著是讓使用者可以觀察在 Steam 平台上的遊戲價格變動
亦或著是你想成立一個遊戲價格比價網
例如有些遊戲可能在 Steam 上也有賣 、 Origin 也有賣
但是使用者可以透過你的網站或是 Mobile application 來取得價格資訊甚至比價
更甚至你可以使用曲線圖告訴使用者各大平台接下來有可能會特價的日期

那讓我們來觀察這個網站應該怎麼爬

我們打開 Steam – Counter-Strike: Global Offensive 這個頁面
並且使用 觀察原始碼 功能

螢幕快照 2016-05-11 下午1.35.06

你可以看見原始碼中的價格 是被一個 class 為 game_purchase_price 的 <div> 給包住的
因此我們要做的就是取出這個 div 內所包住的內容

5. 程式碼

import urllib.request
from optparse import OptionParser
from bs4 import BeautifulSoup
import sys

#說明
def usage():
	print (''' \033[92m	crawl from to get something. \n
	usage : python3 web_crawl.py [-g] [gameId]

	-h : help
	-g : gameId

	By Maras. \033[0m''')
	sys.exit()

#取得參數輸入
def get_parameters():
	global gameId
	gameId = None
	optp = OptionParser(add_help_option=False,epilog="web_crawl")
	optp.add_option("-g","--gameId",dest="gameId",help="-g Steam App Game ID")
	optp.add_option("-h","--help",dest="help",action='store_true',help="help you")
	opts, args = optp.parse_args()
	if opts.help:
		usage()

	if opts.gameId is not None:
		gameId = opts.gameId

#開始
if __name__ == '__main__':
	if len(sys.argv) < 1:
		usage()
	get_parameters()
	url = None
	if gameId is not None:
		url = "http://store.steampowered.com/app/" + gameId
	else: 
		print ('Please input -g or -h')

	if url is not None:
		#設置假的瀏覽器資訊
		headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36'}
		#發送請求
		req = urllib.request.Request(url = url,headers=headers)
		page = urllib.request.urlopen(req)
		contentBytes = page.read()
		#進行分割
		soup = BeautifulSoup(str(contentBytes), "html.parser")
		matches = soup.find_all("div", { "class" : "game_purchase_price" })
		#將資訊顯示出來
		print(matches[0].string);

從上一部觀察中我們發現steam是以 gameId 來做分類

因此我們設置了參數 gameId 來讓這個爬蟲可以更活用

在使用時我們只要輸入

$ python3 web_crawl.py -g <遊戲編號>

便可以取得爬回來遊戲價格

為了防止被擋下來,我們設置假的 header 資訊,藉此讓 Server 認為是一般瀏覽器

headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36'}

將 urllib 回傳的 html 從中找到我們需要的元素

soup = BeautifulSoup(str(contentBytes), "html.parser")
matches = soup.find_all("div", { "class" : "game_purchase_price" })

將資訊顯示出來

print(matches[0].string);

接著你將可取得如下圖所示的價格

Steam - Counter-Strike: Global Offensive
螢幕快照 2016-05-11 下午1.34.24

Steam - Grand Theft Auto V

螢幕快照 2016-05-11 下午1.38.18

當你可以取得這些資訊後,你可以在別的程式碼中 call .py 來執行爬蟲
例如在php執行可以使用 exec:

$output = null;
exec('python3 web_crawl.py -g '. $game_id, $output);

更多取得 html tag 的 BeatifulSoup 請參考 https://www.crummy.com/software/BeautifulSoup/bs4/doc/

另在此提供原始碼 : https://github.com/Maras0830/web_crawl

 

作者的話:找時間會在寫一篇進階版的,會登入帳號的爬蟲

2 thoughts on “python3 web crawler 網路爬蟲教學 – 安裝與使用

  1. python有個好處就是可以把bash環境分離
    如果有做數多種網站爬蟲,一定會需要Virtualenv
    小弟誠摯推薦,真心不騙

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *