Python爬蟲(2):溴事百科
阿新 • • 發佈:2018-10-31
首先說明一下,這份程式碼參考了汪海大大的部落格,然後自己重寫並且改動了一下而來。
首先對溴百的原始碼進行一下分析,發現只要關鍵的段子都是在<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()