1. 程式人生 > >Python爬蟲(2):溴事百科

Python爬蟲(2):溴事百科

首先說明一下,這份程式碼參考了汪海大大的部落格,然後自己重寫並且改動了一下而來。

首先對溴百的原始碼進行一下分析,發現只要關鍵的段子都是在<div class="content">內容<span><\span>這種模式下的,所以我們需要對爬蟲的內容進行正則表示式的運算即可。

另外我們需要跳過一些無謂的換行符號,這也是要注意的。

如果結果有問題,最簡單的辦法就是直接複製一段網頁原始碼用正則表示式來搜尋。

還有我們可以進行兩種方式的爬,第一種另開一個執行緒一直慢慢的爬,如果當前頁數足夠就不爬了,休息2s,否則就從當前頁數開始爬,注意爬的時候如果當前的頁數已經被爬過了,那麼就直接跳過即可。

其次如果使用者需要一個特殊的網頁page,比如突然跳到100頁,那麼就另開一個執行緒開始爬,並且將這個頁數的後幾頁也一起爬下來。這樣可以增加命中概率。

這個程式還有很多可以優化的地方,比如什麼時候刪除掉原來爬過的內容(避免內促不夠),對爬下來的內容進行一定處理使得可讀性更好之類的。

最後windows命令列自動預設是gbk解碼,所以可能在cmd上輸出會出錯,因此我們要先把cmd的預設編碼給改成utf-8,同時注意decode的時候注意加上ignore引數~。

import urllib.request as url_req
import urllib.parse as parse
import
urllib import re import threading class spider_model(): def __init__(self): self.page = 1 self.pages = {} self.datapat = re.compile(r'<div class="content">\n*<span>(.*?)</span>',re.DOTALL) self.enable = False self.num = 3 def scrapyPages
(self,page):
url = 'http://www.qiushibaike.com/hot/page/{}.format(page)' user_agent = r''''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2504.0 Safari/537.36''' header ={'User-Agent':user_agent}#'Origin':'http://my.csdn.net/my/mycsdn'} req = url_req.Request(url,headers=header) response = url_req.urlopen(req) #print(response.read().decode('utf-8')) content = response.read().decode('utf-8','ignore') text = self.datapat.findall(content) self.pages[page] = text # to load specific page def loadSpecificPage(self,objPage): for i in range(objPage,objPage+self.num): self.scrapyPages(i) # to load page in backend def loadPage(self): while self.enable: if len(pages) < 5: if self.page not in self.pages: scrapyPages() self.page += 1 else: sleep(2) def start(self): self.enable = True pages = self.pages Backend = threading.Thread(target = self.loadPage,name='backend') while self.enable: page = int(input('input page you want to get')) if page =='quit': self.enable = False break if page not in pages: T = threading.Thread(target = self.loadSpecificPage,args = (page,),name = 'backend') T.start() T.join() text = pages[page] for line in text: print(line) spider = spider_model() spider.start()