盈佳国际天天做赢家网站,建筑焊工证查询网站官方网,网络推广的优化服务,北京网站系统开发python爬虫的方便大家都懂的。那么#xff0c;既然常用#xff0c;那么我们当然要封装啦。
那么我们可以先封装一个父类的爬虫
我自己的设计想法就是#xff0c;首先#xff0c;爬虫必须要有个字段来存储匹配的规则gainRule#xff0c;然后有个字段存储需要取什么属性outA…python爬虫的方便大家都懂的。那么既然常用那么我们当然要封装啦。
那么我们可以先封装一个父类的爬虫
我自己的设计想法就是首先爬虫必须要有个字段来存储匹配的规则gainRule然后有个字段存储需要取什么属性outAttr
然后就是有个需要处理的数据列表gainList最后是一个存储输出列表数据的outList和存储输出单条数据的outData
那么这个爬虫的父类定义如下
from bs4 importBeautifulSoupimportrequestsimportreclassSpiderHp:#gainRule页面的解析规则,outAttr页面存储的规则,gainList需要解析的列表页,
def __init__(self,gainRule,outAttrNone,gainListNone):
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.gainRulegainRule
self.outAttroutAttr
self.gainListgainList
self.reqrequests.Session()
self.outList[]
self.outData
#处理列表数据
def startAll(self,gainListNone):ifgainList:
self.gainListgainListfor url inself.gainList:
self.InitUrlList(url)#处理单页数据
defstart(self,gainData):
self.InitUrlList(gainData)
爬虫的基本功能ok之后。接着我们要定义自己的种类爬虫。
比如我们一般需要一个爬取单个页面单个特征值的普通爬虫那么。我们写一个爬虫继承父类
#单页单条数据爬虫
classSpiderSigDataHp(SpiderHp):defInitUrlList(self, url):
reqData self.req.get(url, headersself.headers)
soup BeautifulSoup(reqData.text, lxml)
nodeListsoup.select(self.gainRule)ifnodeList:ifself.outAttr:
self.outDatanodeList[0].get(self.outAttr)else:
self.outData nodeList[0]
像这个刚刚定义的爬虫我们一般可以用来爬取分页数量之类的。
接着我们再定义一个专门处理列表页的爬虫
#列表页通用爬虫
classSpiderListHp(SpiderHp):defInitUrlList(self, url):
reqData self.req.get(url, headersself.headers)
soup BeautifulSoup(reqData.text, lxml)
nodeListsoup.select(self.gainRule)for node innodeList:ifself.outAttr:
datanode.get(self.outAttr)else:
datanodeif data not inself.outList:
self.outList.append(data)if notnodeList:print(nodelist err,url)
最后再定义一个详情页的爬虫即可
#详情页爬虫
classSpiderDetailHp(SpiderHp):defInitUrlList(self, url):
reqData self.req.get(url, headersself.headers)
soup BeautifulSoup(reqData.text, lxml)
data{}for key inself.gainRule:
pssoup.select(self.gainRule[key])ifps:ifself.outAttr[key]:
data[key]ps[0].get(self.outAttr[key])else:
data[key]ps[0]
strrepr(data[key])#去掉标签数据。一般如果取到最后还有标签。都是没用的了
data[key]re.sub(.?,,str)
self.outList.append(data)
这样我们的爬虫就完成了。如果还有其他特殊需求的。可以再自己定义。
一般通过这三种爬虫的组合使用。可以解决大多数网页的捕获。接着我来随便演示下使用。
importSpiderimportre
homehttp://www.xxxxxxx.net/ #就不告诉你们我在爬什么了
defmain():
url home hmh/list_6_1.htmlnumgetPage(url) #获取分页数量
list[homehmh/list_6_{}.html.format(i) for i in range(1,2)]
hlistgetList(list)for i inrange(len(hlist)):
hlist[i]homehlist[i]print(hlist[i])imgListgetDetail(hlist)print(imgList)print(len(imgList))#获取页面的分页数量
defgetPage(url):
gainRule span.pageinfo strongmgrSpider.SpiderSigDataHp(gainRule)
mgr.start(url)
strrepr(mgr.outData)#去掉所有的标签的内容
numint(re.sub(.?,,str))returnnum#获取列表页
defgetList(list):
gainRule ul.piclist li aoutAttr hrefmgrSpider.SpiderListHp(gainRule, outAttr)
mgr.startAll(list)returnmgr.outList#获取详情页信息
defgetDetail(list):
gainData{}
outAttr{}gainData[image]#imgshow imggainData[page]li.thisclass aoutAttr[image]srcoutAttr[page]mgrSpider.SpiderDetailHp(gainData, outAttr)
mgr.startAll(list)returnmgr.outListif __name____main__:
main()
好了。就这样。最后配合下载和保存数据库