python爬取糗事百科(入門級)

python3+pycharm+window7

import urllib.requestimport urllib.errorimport repage=2url=https://www.qiushibaike.com/text/page/+str(page)user_agent = Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36headers = {User-Agent: user_agent}try: data1 = urllib.request.Request(url, headers=headers) data = urllib.request.urlopen(data1).read().decode(utf-8) pattern_author = re.compile(u<h2>(.*?)</h2>, re.S) pattern_content = re.compile(u<div class="content">(.*?)</div>, re.S) pattern_comment = re.compile(u<i class="number">(d*)</i>s*評論, re.S) find_author = re.findall(pattern_author, data) find_content = re.findall(pattern_content, data) find_comment = re.findall(pattern_comment, data) if find_author: for i in range(len(find_author)): result = str(i) + " " + find_author[i] + " " + find_content[i] + " " + str(find_comment[i]) print(result)except urllib.error.URLError as e: if hasattr(e, "code"): print(e.code) if hasattr(e, "reason"): print(e.reason)

最終結果為:

註:1、decode(utf-8)

要是不加,則在pycharm中顯示為:

加了之後,就是Html在網頁中的形式

2. 獲取作者的正則表達式

pattern_author = re.compile(u<h2>(.*?)</h2>, re.S)

獲取段子

pattern_content = re.compile(u<div class="content">(.*?)</div>, re.S)

獲取評論:

pattern_comment = re.compile(u<i class="number">(d*)</i>s*評論, re.S)

d : 匹配任意數字,等價於 [0-9]

代碼整合後:

import urllib.requestimport urllib.errorimport refrom twisted.python.compat import raw_input"""爬取糗事百科的段子"""class QSBK: # 初始化方法,定義一些變數 def __init__(self): self.pageIndex = 1 self.user_agent =Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36 # 初始化headers self.headers = {User-Agent: self.user_agent} # 存放段子的變數,每一個元素是每一頁的段子們 self.stories = [] # 存放程序是否繼續運行的變數 self.enable = False print("__init__") # 傳入某一頁的索引獲得頁面代碼 def getPage(self,pageIndex): url=https://www.qiushibaike.com/text/page/+str(pageIndex) try: data1 = urllib.request.Request(url, headers=self.headers) data = urllib.request.urlopen(data1).read().decode(utf-8) return data except urllib.error.URLError as e: if hasattr(e, "reason"): print(u"連接糗事百科失敗,錯誤原因", e.reason) return None print("getPage") #傳入某一頁代碼,返回本頁不的段子列表 def getPageItems(self, pageIndex): data=self.getPage(pageIndex) if not data: print("頁面載入失敗") return None pattern_author = re.compile(u<h2>(.*?)</h2>, re.S) pattern_content = re.compile(u<div class="content">(.*?)</div>, re.S) pattern_comment = re.compile(u<i class="number">(d*)</i>, re.S) find_author = re.findall(pattern_author, data) find_content = re.findall(pattern_content, data) find_comment = re.findall(pattern_comment, data) pageStories = [] if find_author: for i in range(len(find_author)): # pageStories = str(i) + " " + find_author[i] + " " + find_content[i] + " " + str(find_comment[i]) pageStories.append([find_author[i].strip(),find_content[i].strip(),find_comment[i].strip()]) return pageStories # 載入並提取頁面的內容,加入到列表中 def loadPage(self): # 如果當前未看的頁數少於2頁,則載入新一頁 if self.enable == True: if len(self.stories) < 2: # 獲取新一頁 pageStories = self.getPageItems(self.pageIndex) # 將該頁的段子存放到全局list中 if pageStories: self.stories.append(pageStories) # 獲取完之後頁碼索引加一,表示下次讀取下一頁 self.pageIndex += 1 def getOneStory(self, pageStories, page): # 遍歷一頁的段子 for story in pageStories: # 等待用戶輸入 input = raw_input() # 每當輸入回車一次,判斷一下是否要載入新頁面 self.loadPage() # 如果輸入Q則程序結束 if input == "Q": self.enable = False return print(story[0],story[1],story[2]) # 開始方法 def start(self): print( u"正在讀取糗事百科,按回車查看新段子,Q退出") # 使變數為True,程序可以正常運行 self.enable = True # 先載入一頁內容 self.loadPage() # 局部變數,控制當前讀到了第幾頁 nowPage = 2 while self.enable: if len(self.stories) > 0: # 從全局list中獲取一頁的段子 pageStories = self.stories[0] # 當前讀到的頁數加一 nowPage += 1 # 將全局list中第一個元素刪除,因為已經取出 del self.stories[0] # 輸出該頁的段子 self.getOneStory(pageStories, nowPage)p=QSBK()p.start()

推薦閱讀:

如何才能自豪地講自己掉進過糞坑?
如何解決內容侵權問題?
你經歷過最尷尬的事情是什麼?
知乎會不會隨著用戶的增多,走糗事百科的老路,帖子質量極速下降?

TAG:Python | 爬蟲 | 糗事百科 |