最近拉肚子三天了,晚上單位又聚餐,一不當心吃多了點,晚上跑廁所跑的頻繁,索性睡不着了,參照網上資料,敲了段python 爬蟲代碼,第一次學習除了shell 和js 外的腳本語言,無限的坑坑,都說python 的效率是 java 的3倍,因爲是新手,跌跌撞撞總算是寫了出來,仍是比較欣慰的。
簡單介紹一下python :
一、設計哲學: Python的設計哲學是「優雅」、「明確」、「簡單」。所以,Perl語言中「老是有多種方法來作同一件事」的理念在Python開發者中一般是難以忍受的。Python開發者的哲學是「用一種方法,最好是隻有一種方法來作一件事」。
二、用途:(1).運維:數據挖掘。java
(2).抓取網頁比較多,生成報表,批量刪除某種文件等等小事。。。python
(3).數據採集,服務器上小工具編寫
(4).使用範圍廣,Linux和Windows、Mac OS等上都能用,也就是平臺無關性吧web
(5).不少自動化測試工具都支持Python腳本,因此才須要應聘者瞭解這方面shell
(6).整理文檔,備份,監視服務器django
三、常見的python web 框架
Django: Python Web應用開發框架
Flask:一個用Python編寫的輕量級Web應用框架
Web2py:全棧式Web框架
Dpark:Python版的Spark
言歸正傳:寫代碼第一個坑就是縮進,最近看一些個做者的代碼沒有縮進簡直沒法忍受,要是在python中沒有縮進,就是違背了自己的語法。第二個坑就是代碼調試。好歹都已經解決,下面是我爬了百度貼吧nba 的一個帖子,以下:
flask
__author__ = 'CQC' # -*- coding:utf-8 -*- #import urllib import urllib2 import re #處理頁面標籤類 class Tool: #去除img標籤,7位長空格 removeImg = re.compile('<img.*?>| {7}|') #刪除超連接標籤 removeAddr = re.compile('<a.*?>|</a>') #把換行的標籤換爲\n replaceLine = re.compile('<tr>|<div>|</div>|</p>') #將表格製表<td>替換爲\t replaceTD = re.compile('<td>') #把段落開頭換爲\n加空兩格 replacePara = re.compile('<p.*?>') #將換行符或雙換行符替換爲\n replaceBR = re.compile('<br><br>|<br>') #將其他標籤剔除 removeExtraTag = re.compile('<.*?>') def replace(self, x): x = re.sub(self.removeImg, "", x) x = re.sub(self.removeAddr, "", x) x = re.sub(self.replaceLine, "\n", x) x = re.sub(self.replaceTD, "\t", x) x = re.sub(self.replacePara, "\n ", x) x = re.sub(self.replaceBR, "\n", x) x = re.sub(self.removeExtraTag, "", x) #strip()將先後多餘內容刪除 return x.strip() #百度貼吧爬蟲類 class BDTB: #初始化,傳入基地址,是否只看樓主的參數 def __init__(self, baseUrl, seeLZ): print '_int_ 至關於這個累的構造函數' self.baseURL = baseUrl self.seeLZ = '?see_lz=' + str(seeLZ) self.tool = Tool() def getPage(self, pageNum): print '獲取百度貼吧地幾頁的帖子開始' try: url = self.baseURL + self.seeLZ + '&pn=' + str(pageNum) request = urllib2.Request(url) response = urllib2.urlopen(request) return response.read().decode('utf-8') except urllib2.URLError, e: if hasattr(e, "reason"): print u"鏈接百度貼吧失敗.錯誤緣由", e.reason return None print '獲取百度貼吧地幾頁的帖子結束' #獲取帖子標題 def getTile(self): print '獲取帖子標題開始' page = self.getPage(1) pattern = re.compile('<h1 class="core_title_txt.*?>(.*?)</h1>', re.S) result = re.search(pattern, page) if result: #print result.group(1)#測試輸出 return result.group(1).strip() else: return None print '獲取帖子標題結束' #提取帖子頁數 #獲取帖子一共有多少頁 def getPageNum(self): print '獲取帖子頁數一共有多少頁開始' page = self.getPage(1) pattern = re.compile('<li class="l_reply_num.*?</span>.*?<span.*?>(.*?)</span>', re.S) result = re.search(pattern, page) if result: #print result.group(1)#測試輸出 return result.group(1).strip() else: return None print '獲取帖子頁數一共有多少頁結束' def getContent(self, page): print '獲取正文內容開始' pattern = re.compile('<div id="post_content_.*?>(.*?)</div>', re.S) items = re.findall(pattern, page) #for item in items: # print item #print items[1] print self.tool.replace(items[1]) print '獲取正文內容結束' baseURL = 'http://tieba.baidu.com/p/3138733512' bdtb = BDTB(baseURL, 1) bdtb.getContent(bdtb.getPage(1))