一行正則抓取糗事百科

Python小白,剛學習爬蟲不久,會一般的靜態網頁抓取,動手來寫第一個例子。

一、目標

1、抓取糗事百科熱門帖,獲取其**發布者**、**評論(及數量)**、**贊踩(及數量)**等

2、將信息清洗並列印,循環輸出

3、設計程序,使可以選擇抓取的頁面範圍

4、將每一頁的信息保存到文本

二、開發環境介紹

phthon 2.7.13

IDE:PyCharmt

採用庫:re、requests、time

三、步驟

1、獲取源碼

t首先用requests庫的get方法獲取首頁源代碼

user_agent = Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 nheaders={User_agent: user_agent} nr=requests.get(url,headers=headers) nresult=r.text nprint resultn

結果輸出如下

2、匹配正則

如圖所示

打開360瀏覽器,右鍵點擊審查元素,可以清晰的看到**發布者**、**年齡**、**發布內容**、**評論數**等的分布及標籤構造,根據關鍵詞可以匹配正則。設置循環,列印輸出。

pattern=re.compile(<div class="author.*?<h2>(.*?)</h2>.*?Icon">(.*?)</div>.*?<div class="content">.*?<span>(.*?)</span>.*?<span.*?stats-vote.*?number">(.*?)</i>.*?stats-comments.*?number">(.*?)</i>.*?up.*?number hidden">(.*?)</span>.*?down.*?number hidden">(.*?)</span>,re.S) nitems=re.findall(pattern,result) nnumber=1 nfor item in items: n print u n print number,u樓,un樓主:,item[0],u,item[1],u歲,un發言:,self.tool.replace(item[2]),un好笑:,item[3],un評論:,item[4],un贊:,item[5],un踩:,item[6] n time.sleep(0.1) n number+=1n

3、 面向對象

#定義一個Spider類 nclass Spider(object): n #初始化參數 n def __init__(self): n self.siteURL =http://www.qiushibaike.com/ n self.tool=Tool() n n #獲取網頁源碼 n def getSource(self,url): n user_agent = Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 n headers = {User_agent: user_agent} n r=requests.get(url,headers=headers) n result=r.text n return result n n #獲取詳情頁信息,並循環列印輸出 n def getDetailPage(self,detailURL): n source=self.getSource(detailURL) n pattern=re.compile(<div class="author.*?<h2>(.*?)</h2>.*?Icon">(.*?)</div>.*?<div class="content">.*?<span>(.*?)</span>.*?<span.*?stats-vote.*?number">(.*?)</i>.*?stats-comments.*?number">(.*?)</i>.*?up.*?number hidden">(.*?)</span>.*?down.*?number hidden">(.*?)</span>,re.S) n items=re.findall(pattern,source) n number=1 n for item in items: n print u n print number,u樓,un樓主:,item[0],u,item[1],u歲,un發言:,self.tool.replace(item[2]),un好笑:,item[3],un評論:,item[4],un贊:,item[5],un踩:,item[6] n time.sleep(0.1) n number+=1 n return itemsn

4、數據清洗

可以看到所得代碼中含較多的</br><br><br />等標籤,可以定義一個Tool類進行清洗。

class Tool(): n def replace(self,x): n x=re.sub(re.compile(<br>|</br>|/>|<br),"",x) n return x.strip() n

5、文本保存

定義一個saveDetailPage函數,傳入文件名和數據,在此不贅述

6、獲取多頁

上面的內容我們已經成功用正則表達式匹配出想要的內容,想獲取多頁,只需設置一個循環即可,所以關鍵內容來啦!

觀察底面標籤可知熱門評論共35頁,觀察網頁地址欄可發現規律:

首頁 url即qiushibaike.com/,從第二頁開始為 url+/8hr/page/x/?s=4964698

可以推測:8hr為8小時內最熱門,x即頁數,後面s=4964698,猜測是訪問該網站的總次數,因為如果在同一個會話中,s是相同的。而另外打開訪問時s又不同,且每次發現s有增加!

由以上分析,我們要遍歷這35頁,要分情況討論。

四、代碼

#!/usr/bin/env python n# -*- coding: utf-8 -*- n nimport re nimport requests nimport time n n n#定義一個Tool類,方便用replace方法把換行符等刪除 nclass Tool(): n def replace(self,x): n x=re.sub(re.compile(<br>|</br>|/>|<br),"",x) n return x.strip() n n n#定義一個Spider類 nclass Spider(object): n #初始化參數 n def __init__(self): n self.siteURL =http://www.qiushibaike.com/ n self.tool=Tool() n n #獲取網頁源碼 n def getSource(self,url): n user_agent = Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 n headers = {User_agent: user_agent} n r=requests.get(url,headers=headers) n result=r.text n return result n n #獲取詳情頁信息,並循環列印輸出 n def getDetailPage(self,detailURL): n source=self.getSource(detailURL) n pattern=re.compile(<div class="author.*?<h2>(.*?)</h2>.*?Icon">(.*?)</div>.*?<div class="content">.*?<span>(.*?)</span>.*?<span.*?stats-vote.*?number">(.*?)</i>.*?stats-comments.*?number">(.*?)</i>.*?up.*?number hidden">(.*?)</span>.*?down.*?number hidden">(.*?)</span>,re.S) n items=re.findall(pattern,source) n number=1 n for item in items: n print u n print number,u樓,un樓主:,item[0],u,item[1],u歲,un發言:,self.tool.replace(item[2]),un好笑:,item[3],un評論:,item[4],un贊:,item[5],un踩:,item[6] n time.sleep(0.1) n number+=1 n return items n n #保存信息寫入文件 n def saveDetailPage(self,data,name): n fileName=page+name+.+txt n f=open(fileName,wb) n f.write(data.encode(utf-8)) n print u,u成功將數據保存入文件,fileName n f.close() n n #對一頁的操作 n def OnePage(self,detailURL,name): n data=self.getDetailPage(detailURL) n self.saveDetailPage(str(data),str(name)) n n #對很多頁的操作 n #分兩種情況討論,start頁等於1start頁大於1 n def getAllPage(self,start,end): n if start==1: n print u正在獲取第1頁的數據... n detailURL=self.siteURL n self.OnePage(detailURL,start) n number=2 n for page in range(2, end+1): n print u正在獲取第, number, u頁的數據... n detailURL = self.siteURL + 8hr/page/ + str(page) + /?s=4964625 n self.OnePage(detailURL,number) n time.sleep(2) n number +=1 n if number==end+1: n print u,un載入結束! n return False n n elif start>1: n number=start n for page in range(start,end+1): n print u,un正在獲取第,number,u頁的數據... n detailURL=self.siteURL + 8hr/page/ +str(page)+ /?s=4964625 n self.OnePage(detailURL,number) n time.sleep(2) n number += 1 n if number==end+1: n print u,u載入結束! n return False n nspider=Spider() nspider.getAllPage(start=int(raw_input(請輸入起始頁數:)),end=int(raw_input(請輸入結束頁數))n

五、結果

結果就是下面這樣啦~

六、總結

最後總結本文關鍵:

1、匹配正則

2、自定義Tool類清洗數據

3、構造URL翻頁,第一頁和之後不一樣,分情況討論

並設置可以下載的起、始頁數

4、數據保存入txt

本篇就是這樣了~

推薦閱讀:

你用過印象筆記嗎?一個奇葩需求的另類玩法
樂趣十足地用playgrounds學編程A--第4課
百分比進度條

TAG:爬虫 | 自学编程 | Python |