一行正則抓取糗事百科
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
#定義一個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即http://www.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
本篇就是這樣了~
推薦閱讀: