python爬蟲的方便你們都懂的。那麼,既然經常使用,那麼咱們固然要封裝啦。html
那麼咱們能夠先封裝一個父類的爬蟲node
我本身的設計想法就是,首先,爬蟲必需要有個字段來存儲匹配的規則gainRule,而後有個字段存儲須要取什麼屬性outAttr,python
而後就是有個須要處理的數據列表gainList,最後是一個存儲輸出列表數據的outList,和存儲輸出單條數據的outData數據庫
那麼這個爬蟲的父類定義以下app
from bs4 import BeautifulSoup import requests import re class SpiderHp: #gainRule頁面的解析規則,outAttr頁面存儲的規則,gainList須要解析的列表頁, def __init__(self,gainRule,outAttr=None,gainList=None): self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"} self.gainRule=gainRule self.outAttr=outAttr self.gainList=gainList self.req=requests.Session() self.outList=[] self.outData="" #處理列表數據 def startAll(self,gainList=None): if gainList: self.gainList=gainList for url in self.gainList: self.InitUrlList(url) #處理單頁數據 def start(self,gainData): self.InitUrlList(gainData)
爬蟲的基本功能ok以後。接着咱們要定義本身的種類爬蟲。python爬蟲
好比咱們通常須要一個爬取單個頁面,單個特徵值的普通爬蟲,那麼。咱們寫一個爬蟲繼承父類ide
#單頁單條數據爬蟲 class SpiderSigDataHp(SpiderHp): def InitUrlList(self, url): reqData = self.req.get(url, headers=self.headers) soup = BeautifulSoup(reqData.text, "lxml") nodeList = soup.select(self.gainRule) if nodeList: if self.outAttr: self.outData=nodeList[0].get(self.outAttr) else: self.outData = nodeList[0]
像這個剛剛定義的爬蟲咱們通常能夠用來爬取分頁數量之類的。this
接着咱們再定義一個專門處理列表頁的爬蟲url
#列表頁通用爬蟲 class SpiderListHp(SpiderHp): def InitUrlList(self, url): reqData = self.req.get(url, headers=self.headers) soup = BeautifulSoup(reqData.text, "lxml") nodeList = soup.select(self.gainRule) for node in nodeList: if self.outAttr: data=node.get(self.outAttr) else: data = node if data not in self.outList: self.outList.append(data) if not nodeList: print("nodelist err ",url)
最後再定義一個詳情頁的爬蟲便可spa
#詳情頁爬蟲 class SpiderDetailHp(SpiderHp): def InitUrlList(self, url): reqData = self.req.get(url, headers=self.headers) soup = BeautifulSoup(reqData.text, "lxml") data = {} for key in self.gainRule: ps = soup.select(self.gainRule[key]) if ps: if self.outAttr[key]: data[key]=ps[0].get(self.outAttr[key]) else: data[key] = ps[0] str=repr(data[key]) #去掉標籤數據。通常若是取到最後還有標籤。都是沒用的了 data[key]=re.sub("<.+?>","",str) self.outList.append(data)
這樣咱們的爬蟲就完成了。若是還有其餘特殊需求的。能夠再本身定義。
通常經過這三種爬蟲的組合使用。能夠解決大多數網頁的捕獲。接着我來隨便演示下使用。
import Spider import re home="http://www.xxxxxxx.net/" #就不告訴大家我在爬什麼了 def main(): url = home + "hmh/list_6_1.html" num=getPage(url) #獲取分頁數量 list=[home+"hmh/list_6_{}.html".format(i) for i in range(1,2)] hlist=getList(list) for i in range(len(hlist)): hlist[i]=home+hlist[i] print(hlist[i]) imgList=getDetail(hlist) print(imgList) print(len(imgList)) #獲取頁面的分頁數量 def getPage(url): gainRule = "span.pageinfo > strong" mgr = Spider.SpiderSigDataHp(gainRule) mgr.start(url) str=repr(mgr.outData) #去掉全部的標籤的內容 num=int(re.sub("<.+?>","",str)) return num #獲取列表頁 def getList(list): gainRule = "ul.piclist > li > a" outAttr = "href" mgr = Spider.SpiderListHp(gainRule, outAttr) mgr.startAll(list) return mgr.outList #獲取詳情頁信息 def getDetail(list): gainData ={} outAttr = {} gainData["image"]="#imgshow > img" gainData["page"]="li.thisclass > a" outAttr["image"]="src" outAttr["page"]="" mgr = Spider.SpiderDetailHp(gainData, outAttr) mgr.startAll(list) return mgr.outList if __name__=="__main__": main()
好了。就這樣。最後配合下載和保存數據庫