爬蟲學習心得_第1頁
已閱讀1頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、爬蟲學習心得,陳思哲233201222038172012級計算機一班,原來的代碼有幾點我們要改的,1.區(qū)號,點評網為不同的商區(qū)編訂不同的號,而且值得注意的是它通常不是連著的,像開始時我們模仿北京的編號就一連串下來,那是錯誤的。我個人采取的方法是一個區(qū)一個區(qū)的爬,那怎么知道區(qū)號呢?在網址最上方的最后有一個r1841 那么就代表著鼓浪嶼的區(qū)號,由于要求是一個區(qū)建一個文件,那么鼓浪嶼就可以和別的思明區(qū)的編號建在一個列表里。2.指定一個

2、文件來存放爬出來的信息,這些信息會以txt格式來保存。f=open('D:/dianping/'+str(time.strftime(ISOTIMEFORMAT)) +'.txt','a+'),,這個就是多IP爬蟲,一個IP很容易就被發(fā)現并禁止,,這個就是多客戶端爬蟲,單一個的客戶端很容易被發(fā)現并禁掉,,,之后介紹一下搜索的方式,老師給的代碼是一種典型的深度優(yōu)先搜索,,impo

3、rt urllib2,urlliburllib2模塊定義的函數和類幫助打開url(主要是HTTP)在一個復雜的世界-基本和簡要身份驗證,重定向,cookie和更多。 import re 正則表達式import time 提供各種時間函數import string 字符串處理的函數improt request 與urlib差不多,更簡單,import socket套接字套接字是為特定網絡協議(例如TCP/

4、IP,ICMP/IP,UDP/IP等)套件對上的網絡應用程序提供者提供當前可移植標準的對象。它們允許程序接受并進行連接,如發(fā)送和接受數據。為了建立通信通道,網絡通信的每個端點擁有一個套接字對象極為重要。Python中的random模塊用于生成隨機數。 import user_agents 這個比較特殊,是人為定義的庫,這個庫存儲了許多IP或是對點評網的訪問方式,目的就是隨機選一個IP訪問以避免網站對單一IP登陸的封殺。,

5、timeout = 60 socket.setdefaulttimeout(timeout) #設置 HTTP 或 Socket 訪問超時,來防止爬蟲抓取某個頁面時間過長。(這個時間用秒 #來算)def get_status(url): r = requests.get(url, allow_redirects = False)# allow_redirects = False不允許間接地訪問,用re

6、quest庫中的get函數來抓取URL return r.status_code,,#獲取網頁內容def content_get(url): try:#“#”是注釋的意思 # proxy_ip =random.choice(proxyIP.proxy_list) # print proxy_ip # proxy_support = urllib2.ProxyHandler(p

7、roxy_ip) # opener = urllib2.build_opener(proxy_support,urllib2.HTTPHandler) # urllib2.install_opener(opener) req = urllib2.Request(url)#這個類是一個抽象的URL請求。 user_agent = random.choice(user_agen

8、ts.user_agents) #在剛才的user_agents里面隨機找一個登錄方法 req.add_header('User-Agent',user_agent) req.add_header('Referrer', url) print user_agent#python 的輸出函數是print,page = urllib2.urlopen(r

9、eq) content = page.read() page.close() return content#正常的話就用content來保存讀出的結果并且一定要關閉文件并返回content except UnicodeDecodeError as e: print('-----UnicodeDecodeError url:',url)

10、 return ' '#解碼錯誤則輸出并返回空 except urllib2.HTTPError as e: print("-----HTTPError url:",url) return ' '#網站禁止爬蟲則輸出并返回空 except socket.timeout as e: print("-----s

11、ocket timout:",url) return ' ',#抓取超時則輸出并返回空 except urllib2.URLError, e: if hasattr(e, 'reason'): print 'Failed to reach a server.' print 'Reaso

12、n: ', e.reason return ' ' elif hasattr(e, 'code'):#"elif"相當于else if print 'The server couldn\'t fulfill the request.' print 'Erro

13、r code: ', e.code return ' ' except Exception, e: if DEBUG: print e return ' '# if DEBUG 如果出錯了print e return ' ',#獲取店鋪的urldef get_shopurl

14、(url): content = content_get(url) #尋找店鋪的實際url,例如/shop/6123204,用正則表達式 #find_shopurl = re.compile(r'\s*\s*',re.DOTALL) find_shopurl = re.compile(r'\s*\s*<a href="(.*?)" class="

15、BL"[ ]*title=*',re.DOTALL) result = find_shopurl.findall(content) return result,關于get_shopurl(url):,做到這里,我遇到了好幾天的困境,就是單步編譯到這步就無法從shopurl讀取到數據。然后re.compile又是一個正則函數,之前我并沒學過這部分知識,然后一位好心的廈大學長出現了,。。。(以下省略1000

16、0字) 就是把65行注釋的改為66行的,為什么要這么做呢?就是參考了大眾點評網本身的HTML正則代碼,,#判定是否存在有下一頁,如無則返回None對象def get_nextpage(url): content = content_get(url) find_next = re.compile(r'class=\"NextPage\"(.*?)>') re_n

17、ext = find_next.search(content) return re_next,,def get_info(url): shop = content_get(url) #店鋪名稱 title_re = re.compile(r'(.*?)',re.DOTALL) title = title_re.findall(shop) for i in title:

18、 f.write(i.strip() + '\n') #商鋪一些信息: info_re = re.compile(r'(.*?)') info = info_re.findall(shop) for i in info: f.write(i.strip() + ' ') f.write('\n') #點評

19、人數 count_re = re.compile(r'(.*?)',re.DOTALL) count = count_re.findall(shop) for i in count: f.write('點評人數:' + i + '\n'),,#評分項目 item_re = re.compile(r'\s*(.*?)',re.D

20、OTALL) item = item_re.findall(shop) #分數 socre_re =re.compile(r'\s*.*?(.*?)',re.DOTALL) score = socre_re.findall(shop) for i in item: f.write(i+' ') f.write('\n')

21、 for i in score: f.write(i+'\t') f.write('\n') #餐館地址 address_re = re.compile(r'(.*?)',re.DOTALL) address = address_re.findall(shop) for i in address: f.write(

22、'地址:' + i.strip() + '\n') #餐館電話 tel_re = re.compile(r'(.*?)',re.DOTALL) tel = tel_re.findall(shop) for i in tel: f.write('電話:' + i.strip() + '\n'),,def

23、get_comment(comment_all): #每個用戶對應的評論塊 part_re = re.compile(r'',re.DOTALL) part = part_re.findall(comment_all) for i in part: #用戶 member_re = re.compile(r'(.*?)',re.DOTALL)

24、 member = member_re.findall(str(i)) for j in member: f.write('用戶:' + j.strip() + '\n') #口味,環(huán)境,服務評分 taste_re = re.compile(r'(.*?)',re.DOTALL) tast

25、e = taste_re.findall(str(i)) for j in taste: f.write(j.strip() + '\t') f.write('\n') #評論 comment_re = re.compile(r'(.*?)',re.DOTALL) comment = c

26、omment_re.findall(str(i)) for j in comment: f.write(j.strip() + '\t') f.write('\n'),補充,以上這些正則字符都是一些匹配,編程人員在原網址的源代碼中查出這些關鍵的匹配符,然后用python的正則形式表示出,對于爬蟲十分方便。上面的一些方法(函數)用#def …的形式給

27、出,與c等語言的函數定義不同Python作為一種腳本語言有其特殊性,我們用一種叫ULIPAD的工具進行編輯,我們只是編輯而非編譯。另外,它是一種面向對象的語言,它采用類做定義,并且一個變量也是一個類。,,一個良好的爬蟲代碼,應該有比較多的關鍵參數的輸出,以方便查看程序目前的狀態(tài)。比如下一頁的count,用來記是第幾組評論。如果停下來了,且程序正在運行,那么可能是正在收集一組的評論一起發(fā)送,或是不幸掉進了爬蟲陷阱。,,該程序其中的一

28、個特點就是判斷分支多,而且就是錯誤,也要區(qū)分是何種類型的錯誤。比如眾多的except分支(類似于C中的switch分支),這樣是嚴謹而科學的。因為爬蟲中可能出現的問題通常是很難預測的。同樣一個程序,我曾經兩次去跑(沒有修改)。結果第一次過了幾組就卡住了,然后第二組就可以都跑完。,,就起原因我認為是IP活動過于平凡被禁掉了,或是掉進陷阱。,,他山之石,Python提供了許多Module,通過這些Module,可以很簡單的做一些工作。比

29、如,要獲得cloga這個詞在百度搜索結果頁中的排名結果(排名結果+URL),這就是一個很簡單的爬蟲需求。首先,要通過urllib2這個Module獲得對應的HTML源碼。,,,通過上面這三句就可以將URL的源碼存在content變量中,其類型為字符型。接下來是要從這堆HTML源碼中提取我們需要的內容。用Chrome查看一下對應的內容的代碼(也可以用Firefox的Firebug)。,可以看到url的信息存儲在span標簽中,要獲取其

30、中的信息可以用正則式。,,,re.compile是將字符串編譯為用于python正則式的模式,字符前的r表示是純字符,這樣就不需要對元字符進行兩次轉義。re.findall返回的是字符串中符合results_pat的列表,由于在results_pat中使用了子表達式,所以results存儲的就是子表達式所匹配的內容,即與之間的內容。,,特別鳴謝1.某位科研樓305的學長在我軟件崩潰之時教我弄好了環(huán)境變量。2.某位05級廈大老學長(現

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論