版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、爬蟲學(xué)習(xí)心得,陳思哲233201222038172012級計算機一班,原來的代碼有幾點我們要改的,1.區(qū)號,點評網(wǎng)為不同的商區(qū)編訂不同的號,而且值得注意的是它通常不是連著的,像開始時我們模仿北京的編號就一連串下來,那是錯誤的。我個人采取的方法是一個區(qū)一個區(qū)的爬,那怎么知道區(qū)號呢?在網(wǎng)址最上方的最后有一個r1841 那么就代表著鼓浪嶼的區(qū)號,由于要求是一個區(qū)建一個文件,那么鼓浪嶼就可以和別的思明區(qū)的編號建在一個列表里。2.指定一個
2、文件來存放爬出來的信息,這些信息會以txt格式來保存。f=open('D:/dianping/'+str(time.strftime(ISOTIMEFORMAT)) +'.txt','a+'),,這個就是多IP爬蟲,一個IP很容易就被發(fā)現(xiàn)并禁止,,這個就是多客戶端爬蟲,單一個的客戶端很容易被發(fā)現(xiàn)并禁掉,,,之后介紹一下搜索的方式,老師給的代碼是一種典型的深度優(yōu)先搜索,,impo
3、rt urllib2,urlliburllib2模塊定義的函數(shù)和類幫助打開url(主要是HTTP)在一個復(fù)雜的世界-基本和簡要身份驗證,重定向,cookie和更多。 import re 正則表達式import time 提供各種時間函數(shù)import string 字符串處理的函數(shù)improt request 與urlib差不多,更簡單,import socket套接字套接字是為特定網(wǎng)絡(luò)協(xié)議(例如TCP/
4、IP,ICMP/IP,UDP/IP等)套件對上的網(wǎng)絡(luò)應(yīng)用程序提供者提供當(dāng)前可移植標(biāo)準(zhǔn)的對象。它們允許程序接受并進行連接,如發(fā)送和接受數(shù)據(jù)。為了建立通信通道,網(wǎng)絡(luò)通信的每個端點擁有一個套接字對象極為重要。Python中的random模塊用于生成隨機數(shù)。 import user_agents 這個比較特殊,是人為定義的庫,這個庫存儲了許多IP或是對點評網(wǎng)的訪問方式,目的就是隨機選一個IP訪問以避免網(wǎng)站對單一IP登陸的封殺。,
5、timeout = 60 socket.setdefaulttimeout(timeout) #設(shè)置 HTTP 或 Socket 訪問超時,來防止爬蟲抓取某個頁面時間過長。(這個時間用秒 #來算)def get_status(url): r = requests.get(url, allow_redirects = False)# allow_redirects = False不允許間接地訪問,用re
6、quest庫中的get函數(shù)來抓取URL return r.status_code,,#獲取網(wǎng)頁內(nèi)容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 的輸出函數(shù)是print,page = urllib2.urlopen(r
9、eq) content = page.read() page.close() return content#正常的話就用content來保存讀出的結(jié)果并且一定要關(guān)閉文件并返回content except UnicodeDecodeError as e: print('-----UnicodeDecodeError url:',url)
10、 return ' '#解碼錯誤則輸出并返回空 except urllib2.HTTPError as e: print("-----HTTPError url:",url) return ' '#網(wǎng)站禁止爬蟲則輸出并返回空 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"相當(dāng)于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,關(guān)于get_shopurl(url):,做到這里,我遇到了好幾天的困境,就是單步編譯到這步就無法從shopurl讀取到數(shù)據(jù)。然后re.compile又是一個正則函數(shù),之前我并沒學(xué)過這部分知識,然后一位好心的廈大學(xué)長出現(xiàn)了,。。。(以下省略1000
16、0字) 就是把65行注釋的改為66行的,為什么要這么做呢?就是參考了大眾點評網(wǎng)本身的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、人數(shù) count_re = re.compile(r'(.*?)',re.DOTALL) count = count_re.findall(shop) for i in count: f.write('點評人數(shù):' + i + '\n'),,#評分項目 item_re = re.compile(r'\s*(.*?)',re.D
20、OTALL) item = item_re.findall(shop) #分?jǐn)?shù) 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): #每個用戶對應(yīng)的評論塊 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)境,服務(wù)評分 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'),補充,以上這些正則字符都是一些匹配,編程人員在原網(wǎng)址的源代碼中查出這些關(guān)鍵的匹配符,然后用python的正則形式表示出,對于爬蟲十分方便。上面的一些方法(函數(shù))用#def …的形式給
27、出,與c等語言的函數(shù)定義不同Python作為一種腳本語言有其特殊性,我們用一種叫ULIPAD的工具進行編輯,我們只是編輯而非編譯。另外,它是一種面向?qū)ο蟮恼Z言,它采用類做定義,并且一個變量也是一個類。,,一個良好的爬蟲代碼,應(yīng)該有比較多的關(guān)鍵參數(shù)的輸出,以方便查看程序目前的狀態(tài)。比如下一頁的count,用來記是第幾組評論。如果停下來了,且程序正在運行,那么可能是正在收集一組的評論一起發(fā)送,或是不幸掉進了爬蟲陷阱。,,該程序其中的一
28、個特點就是判斷分支多,而且就是錯誤,也要區(qū)分是何種類型的錯誤。比如眾多的except分支(類似于C中的switch分支),這樣是嚴(yán)謹(jǐn)而科學(xué)的。因為爬蟲中可能出現(xiàn)的問題通常是很難預(yù)測的。同樣一個程序,我曾經(jīng)兩次去跑(沒有修改)。結(jié)果第一次過了幾組就卡住了,然后第二組就可以都跑完。,,就起原因我認(rèn)為是IP活動過于平凡被禁掉了,或是掉進陷阱。,,他山之石,Python提供了許多Module,通過這些Module,可以很簡單的做一些工作。比
29、如,要獲得cloga這個詞在百度搜索結(jié)果頁中的排名結(jié)果(排名結(jié)果+URL),這就是一個很簡單的爬蟲需求。首先,要通過urllib2這個Module獲得對應(yīng)的HTML源碼。,,,通過上面這三句就可以將URL的源碼存在content變量中,其類型為字符型。接下來是要從這堆HTML源碼中提取我們需要的內(nèi)容。用Chrome查看一下對應(yīng)的內(nèi)容的代碼(也可以用Firefox的Firebug)。,可以看到url的信息存儲在span標(biāo)簽中,要獲取其
30、中的信息可以用正則式。,,,re.compile是將字符串編譯為用于python正則式的模式,字符前的r表示是純字符,這樣就不需要對元字符進行兩次轉(zhuǎn)義。re.findall返回的是字符串中符合results_pat的列表,由于在results_pat中使用了子表達式,所以results存儲的就是子表達式所匹配的內(nèi)容,即與之間的內(nèi)容。,,特別鳴謝1.某位科研樓305的學(xué)長在我軟件崩潰之時教我弄好了環(huán)境變量。2.某位05級廈大老學(xué)長(現(xiàn)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學(xué)習(xí)心得
- 學(xué)習(xí)心得
- 改革開放學(xué)習(xí)心得范文—學(xué)習(xí)心得
- 行動學(xué)習(xí)學(xué)習(xí)心得
- 學(xué)習(xí)黨章學(xué)習(xí)心得
- 大連學(xué)習(xí)心得
- 入黨學(xué)習(xí)心得
- matlab學(xué)習(xí)心得
- 美術(shù)學(xué)習(xí)心得
- 團校學(xué)習(xí)心得
- 課學(xué)習(xí)心得
- 美術(shù)學(xué)習(xí)心得
- 素描學(xué)習(xí)心得
- 警校學(xué)習(xí)心得
- 青馬學(xué)習(xí)心得
- 黨代會學(xué)習(xí)心得
- 廉政學(xué)習(xí)心得
- 《學(xué)習(xí)強國》學(xué)習(xí)心得
- 學(xué)習(xí)黨章學(xué)習(xí)心得
- 《學(xué)習(xí)強國》app學(xué)習(xí)心得
評論
0/150
提交評論