初次學習爬蟲技術,在知乎上看瞭如何爬去糗事百科的段子,於是打算自己也做一個。
實現目標:1,爬取到糗事百科的段子
2,實現每次爬去段子,每按一次回車爬取到下一頁
#技術實現:基於python的實現,利用Requests庫,re庫,bs4庫的BeautifulSoup方法來實現的
主要內容:首先我們要理清一下爬取實現的思路,我們來建構一下主體框架。第一步我們先寫一個利用Requests庫來獲取網頁的方法,第二步我們利用bs4庫的BeautifulSoup方法來分析所獲取的網頁信息並利用正則表達式來匹配相關的段子信息。第三步我們來列印出所獲得的資訊。以上方法我們都透過一個主函數來執行。
一,先導入相關的函式庫
import requests from bs4 import BeautifulSoup import bs4 import re
二,先進行網頁資訊的取得
def getHTMLText(url): try: user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' headers = {'User-Agent': user_agent} r = requests.get(url,headers = headers) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return ""
三,把資訊放到r後再進行解析
soup = BeautifulSoup(html,"html.parser")
我們需要的是段子的內容和發佈人,透過網頁的查看源代碼我們知道段子的發佈人在:
'p', attrs={'class': 'content'}中
段子的內容在
'p', attrs={'class': 'author clearfix'}中
所以我們通過bs4庫的方法來提取這兩個標籤的具體內容
def fillUnivlist(lis,li,html,count): soup = BeautifulSoup(html,"html.parser") try: a = soup.find_all('p', attrs={'class': 'content'}) ll = soup.find_all('p', attrs={'class': 'author clearfix'})
然後通過具體到正則表達式來獲取信息
for sp in a: patten = re.compile(r'<span>(.*?)</span>',re.S) Info = re.findall(patten,str(sp)) lis.append(Info) count = count + 1 for mc in ll: namePatten = re.compile(r'<h2>(.*?)</h2>', re.S) d = re.findall(namePatten, str(mc)) li.append(d)
我們需要注意的是使用find_all以及re的findall方法返回的都是一個列表,使用正規表示式時我們只是粗略提取並沒有把標籤中的換行符去掉
#接下來我們只需要把2個列表的內容進行組合輸出就可以了
def printUnivlist(lis,li,count): for i in range(count): a = li[i][0] b = lis[i][0] print ("%s:"%a+"%s"%b)
然後我做一個輸入控制函數,輸入Q返回錯誤,退出,輸入回車返回正確,進行下一頁段子的加載
def input_enter(): input1 = input() if input1 == 'Q': return False else: return True
我們透過主函數來實現所輸入的控制,如果控制函數回傳的是錯誤就不執行輸出,如果回傳的是正確就繼續輸出。我們透過一個for迴圈來進行載入下一頁。
def main(): passage = 0 enable = True for i in range(20): mc = input_enter() if mc==True: lit = [] li = [] count = 0 passage = passage + 1 qbpassage = passage print(qbpassage) url = 'http://www.qiushibaike.com/8hr/page/' + str(qbpassage) + '/?s=4966318' a = getHTMLText(url) fillUnivlist(lit, li, a, count) number = fillUnivlist(lit, li, a, count) printUnivlist(lit, li, number) else: break
這裡我們需要注意到是每一次for迴圈都會刷新一次lis【】和li【】,這樣每次都可以正確輸出該網頁的段子內容
一下為原始碼:
import requests from bs4 import BeautifulSoup import bs4 import re def getHTMLText(url): try: user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' headers = {'User-Agent': user_agent} r = requests.get(url,headers = headers) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return "" def fillUnivlist(lis,li,html,count): soup = BeautifulSoup(html,"html.parser") try: a = soup.find_all('p', attrs={'class': 'content'}) ll = soup.find_all('p', attrs={'class': 'author clearfix'}) for sp in a: patten = re.compile(r'(.*?)',re.S) Info = re.findall(patten,str(sp)) lis.append(Info) count = count + 1 for mc in ll: namePatten = re.compile(r'(.*?)
', re.S) d = re.findall(namePatten, str(mc)) li.append(d) except: return "" return count def printUnivlist(lis,li,count): for i in range(count): a = li[i][0] b = lis[i][0] print ("%s:"%a+"%s"%b) def input_enter(): input1 = input() if input1 == 'Q': return False else: return True def main(): passage = 0 enable = True for i in range(20): mc = input_enter() if mc==True: lit = [] li = [] count = 0 passage = passage + 1 qbpassage = passage print(qbpassage) url = 'http://www.qiushibaike.com/8hr/page/' + str(qbpassage) + '/?s=4966318' a = getHTMLText(url) fillUnivlist(lit, li, a, count) number = fillUnivlist(lit, li, a, count) printUnivlist(lit, li, number) else: break main()
第一次做還是有很多可以優化的地方希望大家可以指出來。
以上是python的爬蟲技術爬去糗事百科的方法詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!