工具準備的差很少了,接下來就是python爬蟲的封裝了

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()

好了。就這樣。最後配合下載和保存數據庫

相關文章
相關標籤/搜索