2015年4月28日 星期二

Scrapy 使用心得(1)


目前專案在製作一個可以快速搜索遊戲卡片的app
由於已經有相關的wiki了
所以只需要爬資料下來做好search功能

趁現在記憶猶新趕快把心得寫下提醒未來的自己XD

我所使用的環境為: python 2.7, win7 64, mongodb

目的:爬資料進去mongodb

安裝方式為:
pip install scrapy


安裝好了之後開始一個新的專案
scrapy startproject myapp

於是會建立一個
myapp資料夾


檔案結構為
myapp/
    scrapy.cfg
    myapp/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...
spider資料夾內沒有檔案要自行建立spider的檔案
基本上scrapy提供許多種spider
BaseSpider:
from scrapy.spider import BaseSpider
只會爬你提供的url

CrawlSpider:
from scrapy.contrib.spiders import CrawlSpider
會爬你提供的url並把裡面的links也爬一爬

基本上我只使用過這兩種其他就不說明了

BaseSpider使用範例
我們先在spider資料夾內建立一個叫spider.py(檔名可以任意取喔)



from scrapy.spider import BaseSpider


class myappSpiders(BaseSpider): 

 

     name = 'myspider_name' #這個名字很重要喔對scrapy不熟的可能要浪費好幾分鐘在這

     allowed_domains = ['www.example.com']  #要爬的domain


     #start_urls就是爬蟲開始爬的第一個網頁,在BaseSpider中就只爬提供的這些urls
     start_urls = ['http://www.basespider.com/page1'
               ,'http://www.basespider.com/page2'
        ]

    #爬蟲從url爬完會丟到parse內你就可以從這邊設定你想取出的資料是什麼
def parse(self, response): hxs = HtmlXPathSelector(response) item = myappItem() item['item_field'] = hxs.select('//h1[@id="css_id"]/span/text()').extract() return item #這邊看到item = myappItem()與item['item_field']要先到item.py設定好 #return item會把item丟進去pipeline去處理,資料量不多其實這邊寫個file.write就好了

item.py的設定範例


from scrapy.item import Item, Field


class myappItem(Item):
    item_field = Field()

#class要跟spider.py內的myappItem同名, 每個你要抓的item_field都要來設定一下Field()




接著把terminal小黑窗目標移到scrapy.cfg同個位置
執行
scrapy crawl myspider_name
就可以開始抓囉
不要跟我一樣scrapy crawl 檔名浪費好幾分鐘阿XD

等我下次心血來潮再把後面補完QQ







2015年1月23日 星期五

Install scapy with python 2.7 in windows

參考網址
http://www.secdev.org/projects/scapy/doc/installation.html#windows 
得知需要的packages還蠻多的
不過此處列出的都是python 2.5 2.6的package links.

 2.7的找了一下

1. pywin32
http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/

2. Winpcap
http://www.winpcap.org/install/bin/WinPcap_4_1_1.exe

3. pypcap
https://code.google.com/p/pypcap/issues/detail?id=36 

4. libdnet
http://dirk-loss.de/scapy/dnet-1.12.win32-py2.7.exe

5. pyreadline
https://pypi.python.org/pypi/pyreadline/2.0

6. scapy
http://bb.secdev.org/scapy/downloads

除了scapy要解壓縮跑python setup.py之外
剩的都是installer沒什麼安裝問題
這篇應該能夠幫助不少人省下找package的時間

2014年8月8日 星期五

演算法quine python範例

Quine演算法為程式語言經過編譯之後
執行顯示出來的內容必須與原始碼相同

wiki介紹


原本以為很難
要描述顯示出來的內容必須再新添加內容
這樣顯示的內容又會再增加
好像無解一樣

實作後發現比想像中簡單多了

python範例:

s="quine"
v="s=v=l=n='n p="
l=':"()[]+\\'
n='\n'
p='print(v[:2]+l[1]+s+l[1]+n+v[2:4]+l[1]+v+l[1]+n+v[4:6]+v[8]+l+l[7]+v[8]+n+v[6:9]+l[7]+v[9]+v[8]+n+v[11:13]+v[8]+p+v[8]+n+p)'
print(v[:2]+l[1]+s+l[1]+n+v[2:4]+l[1]+v+l[1]+n+v[4:6]+v[8]+l+l[7]+v[8]+n+v[6:9]+l[7]+v[9]+v[8]+n+v[11:13]+v[8]+p+v[8]+n+p) 

複製code執行,顯示結果將會和code一模一樣

2014年7月26日 星期六

Python for對不同datatype的測試


python的for不同於其他語言
感覺簡潔而且強大了許多
但是往往使用起來對概念的理解上也有點心虛阿XD

所以特別測試一下了解for對不同資料型別的處理方式

字串的處理:


for char in string:
  print char

會計算字串有幾個字元
有幾個字元就迴圈幾次


a = "12345"

for i in a

  print i



結果

1

2

3

4

5






列表的處理(Tuple相同):


for element in list:
  print element

會計算列表有多少個元素
有多少個元素就迴圈幾次

a = ( 'L1' , 'L2' , 'L3' , 'L4' , 'L5' ) for i in a
  print i

結果
L1
L2
L3
L4
L5


字典的處理:


for key in dictionary:
  print key

for key in dictionary
  print dictionary[key]  #印出value

有多少個key就迴圈幾次
排列的順序與key值有關
也就是會由小到大來print出來
如果key是string則會以迭代器的位置來開始印
所以想使用for在dictionary上面
最好key值使用integer較好控制
使用string為key值可能會出現非預期的錯誤



a = { 1:'a', 3:'b', 2:'c', 4:'d', 5:'e' } #注意key順序不同


for i in a


  print i





結果以key值大小排序


1

2

3

4

5



如果想要取出value值
則使用
for i in a
  print a[i]
結果以key值大小取出value值
a
c
b
d
e

2014年7月25日 星期五

正規表示式 regular expression 學習


常常看到程式中出現類似亂碼之莫名其妙的東西
譬如
^\d{3}\s(\w+)&
原來是叫正規表示式阿
也有人叫正則表達式
學名叫regular expression
總而言之就是一種字串的篩選器

regular expression常見於各種語言都會用到
也就是三不五時看到別人python內import的re

常用的部分
\d 數字
\w 任意字元含數字
\s 任意空白字元 space tab都算
{3} 乘以三次\d\d\d 等於\d{3}
( ) 擷取器 abc  a(b)c  b會被擷取出來
. 任意字元
+ 任意字串不包含自己本身
* 任意字串含自己本身
[] 就是or啦 [abc]de , ade,bde,cde都符合
[^] 就是nor啦
^ooxx&  ^開頭&結尾 嚴謹篩選,前後有東西都不合格


Regexone非常棒的教學練習網站
http://regexone.com/

基本上全部的練習做過一遍
應該就都懂了


python sys.argv[]用法


常看到python中出現sys.argv[]這東西
找了些資料總算理解了
紀錄一下備忘

sys.argv[]是python獲取命令列參數的方法
譬如我們在terminal中會輸入的指令
ls -a
-a就是命令列參數
sys.argv[0] 代表了文件的檔案名稱本身
意思就是ls
sys.argv[1] 就代表了-a

以下是參考網路的範例並修改成容易理解的方式




# -*- coding: utf-8 -*-

import sys>



>#建立一個讀取檔案的function能將檔案內容print出來

def readfile(filename): 

 '''read file and print'''

 f = file(filename)

 while True:

  line = f.readline()

  if len(line) == 0:

   break

  print line, 

 f.close()

 

#開始對sys.argv下定義

if len(sys.argv) < 2: #len小於2也就是不帶參數啦

 print 'no argument'

 sys.exit()

if sys.argv[1].startswith('--'):

 option = sys.argv[1][2:] # 取出sys.argv[1]的數值但是忽略掉'--'這兩個字元

 if option == 'version': 

  print 'Version 1.2.3'

 elif option == 'help':

  print 'help documention'

 else:

  print 'only --version --help can be used'

  sys.exit()

else:

 for filename in sys.argv[1:]: #檔案名稱於參數位置時讀取檔案

  readfile(filename)



"""

此檔案名稱為readfile.py

則可以用readfile.py --version來查詢版號

readfile.py --help來查詢help文件

readfile.py readme.txt 可以執行function

"""

2014年7月20日 星期日

AWS (Amazon Web Services) 練習django架站與linux shell的好工具


今天跟著教學申請了一個亞馬遜雲端服務帳號
http://blog.rx836.tw/blog/first-amazon-web-services/

原本一直考慮將我的windows換成ubuntu的想法可以暫停了
windows對於部分開源軟體的安裝實在是有點頭大
但是把我電腦重灌成linux使用起來可能就不是那麼方便了

AWS目前有一年免費可以使用
只要不要超過流量的話
如果真的能架出超過流量的網站(非用來大量上傳下載之類的)
我想付那個費用也是值得的

整個申請流程還算簡單
按照上面的Link做很快就能申請完成了
也速度建置了django基本的運作

目前容易卡關的小細節就是
AWS內運行的Instance並沒有對外的public IP
必須去申請一個
在左方控制那邊的 Elastic IP
申請完之後再把它allocate到你正在跑的instance就行了
不過ssh會被斷線要再重連一次
另外就是security group要設定好
不然外面連不進去也沒有用

Django的測試伺服器必須記得是使用

python mange.py runserver 0.0.0.0:8000
不設定0.0.0.0這個any ip的話
會只給本地端連線
自己的瀏覽器會無法連線過去

最後
不使用了記得到Elastic IP頁面Release IP
據說占著茅坑不拉屎會被罰錢