爬虫python软件准备_工具准备的差不多了,接下来就是python爬虫的封装了
python爬蟲的方便大家都懂的。那么,既然常用,那么我們當然要封裝啦。
那么我們可以先封裝一個父類的爬蟲
我自己的設計想法就是,首先,爬蟲必須要有個字段來存儲匹配的規(guī)則gainRule,然后有個字段存儲需要取什么屬性outAttr,
然后就是有個需要處理的數(shù)據(jù)列表gainList,最后是一個存儲輸出列表數(shù)據(jù)的outList,和存儲輸出單條數(shù)據(jù)的outData
那么這個爬蟲的父類定義如下
from bs4 importBeautifulSoupimportrequestsimportreclassSpiderHp:#gainRule頁面的解析規(guī)則,outAttr頁面存儲的規(guī)則,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=""
#處理列表數(shù)據(jù)
def startAll(self,gainList=None):ifgainList:
self.gainList=gainListfor url inself.gainList:
self.InitUrlList(url)#處理單頁數(shù)據(jù)
defstart(self,gainData):
self.InitUrlList(gainData)
爬蟲的基本功能ok之后。接著我們要定義自己的種類爬蟲。
比如我們一般需要一個爬取單個頁面,單個特征值的普通爬蟲,那么。我們寫一個爬蟲繼承父類
#單頁單條數(shù)據(jù)爬蟲
classSpiderSigDataHp(SpiderHp):defInitUrlList(self, url):
reqData= self.req.get(url, headers=self.headers)
soup= BeautifulSoup(reqData.text, "lxml")
nodeList=soup.select(self.gainRule)ifnodeList:ifself.outAttr:
self.outData=nodeList[0].get(self.outAttr)else:
self.outData= nodeList[0]
像這個剛剛定義的爬蟲我們一般可以用來爬取分頁數(shù)量之類的。
接著我們再定義一個專門處理列表頁的爬蟲
#列表頁通用爬蟲
classSpiderListHp(SpiderHp):defInitUrlList(self, url):
reqData= self.req.get(url, headers=self.headers)
soup= BeautifulSoup(reqData.text, "lxml")
nodeList=soup.select(self.gainRule)for node innodeList:ifself.outAttr:
data=node.get(self.outAttr)else:
data=nodeif data not inself.outList:
self.outList.append(data)if notnodeList:print("nodelist err",url)
最后再定義一個詳情頁的爬蟲即可
#詳情頁爬蟲
classSpiderDetailHp(SpiderHp):defInitUrlList(self, url):
reqData= self.req.get(url, headers=self.headers)
soup= BeautifulSoup(reqData.text, "lxml")
data={}for key inself.gainRule:
ps=soup.select(self.gainRule[key])ifps:ifself.outAttr[key]:
data[key]=ps[0].get(self.outAttr[key])else:
data[key]=ps[0]
str=repr(data[key])#去掉標簽數(shù)據(jù)。一般如果取到最后還有標簽。都是沒用的了
data[key]=re.sub("<.+?>","",str)
self.outList.append(data)
這樣我們的爬蟲就完成了。如果還有其他特殊需求的??梢栽僮约憾x。
一般通過這三種爬蟲的組合使用。可以解決大多數(shù)網(wǎng)頁的捕獲。接著我來隨便演示下使用。
importSpiderimportre
home="http://www.xxxxxxx.net/" #就不告訴你們我在爬什么了
defmain():
url= home + "hmh/list_6_1.html"num=getPage(url) #獲取分頁數(shù)量
list=[home+"hmh/list_6_{}.html".format(i) for i in range(1,2)]
hlist=getList(list)for i inrange(len(hlist)):
hlist[i]=home+hlist[i]print(hlist[i])
imgList=getDetail(hlist)print(imgList)print(len(imgList))#獲取頁面的分頁數(shù)量
defgetPage(url):
gainRule= "span.pageinfo > strong"mgr=Spider.SpiderSigDataHp(gainRule)
mgr.start(url)
str=repr(mgr.outData)#去掉所有的標簽的內(nèi)容
num=int(re.sub("<.+?>","",str))returnnum#獲取列表頁
defgetList(list):
gainRule= "ul.piclist > li > a"outAttr= "href"mgr=Spider.SpiderListHp(gainRule, outAttr)
mgr.startAll(list)returnmgr.outList#獲取詳情頁信息
defgetDetail(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)returnmgr.outListif __name__=="__main__":
main()
好了。就這樣。最后配合下載和保存數(shù)據(jù)庫
總結(jié)
以上是生活随笔為你收集整理的爬虫python软件准备_工具准备的差不多了,接下来就是python爬虫的封装了的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 刷卡提示57能恢复吗_硬盘格式化之后数据
- 下一篇: cocoscreator连接MySQL_