python爬虫的方便大家都懂的。那么,既然常用,那么我们当然要封装啦。

那么我们可以先封装一个父类的爬虫

我自己的设计想法就是,首先,爬虫必须要有个字段来存储匹配的规则gainRule,然后有个字段存储需要取什么属性outAttr,

然后就是有个需要处理的数据列表gainList,最后是一个存储输出列表数据的outList,和存储输出单条数据的outData

那么这个爬虫的父类定义如下

from bs4 importBeautifulSoupimportrequestsimportreclassSpiderHp:#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):ifgainList:

self.gainList=gainListfor url inself.gainList:

self.InitUrlList(url)#处理单页数据

defstart(self,gainData):

self.InitUrlList(gainData)

爬虫的基本功能ok之后。接着我们要定义自己的种类爬虫。

比如我们一般需要一个爬取单个页面,单个特征值的普通爬虫,那么。我们写一个爬虫继承父类

#单页单条数据爬虫

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]

像这个刚刚定义的爬虫我们一般可以用来爬取分页数量之类的。

接着我们再定义一个专门处理列表页的爬虫

#列表页通用爬虫

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])#去掉标签数据。一般如果取到最后还有标签。都是没用的了

data[key]=re.sub("<.+?>","",str)

self.outList.append(data)

这样我们的爬虫就完成了。如果还有其他特殊需求的。可以再自己定义。

一般通过这三种爬虫的组合使用。可以解决大多数网页的捕获。接着我来随便演示下使用。

importSpiderimportre

home="http://www.xxxxxxx.net/" #就不告诉你们我在爬什么了

defmain():

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 inrange(len(hlist)):

hlist[i]=home+hlist[i]print(hlist[i])

imgList=getDetail(hlist)print(imgList)print(len(imgList))#获取页面的分页数量

defgetPage(url):

gainRule= "span.pageinfo > strong"mgr=Spider.SpiderSigDataHp(gainRule)

mgr.start(url)

str=repr(mgr.outData)#去掉所有的标签的内容

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

好了。就这样。最后配合下载和保存数据库

爬虫python软件准备_工具准备的差不多了,接下来就是python爬虫的封装了相关推荐

  1. python软件工程师_为什么每个软件工程师都应该学习Python?

    python软件工程师 大家好,如果您经常关注我的博客 ,或者在HackerNoon上阅读我的文章,那么您可能想知道为什么我要写一篇文章告诉人们学习Python ? 几年前,我不是要您更喜欢Java吗 ...

  2. python爬虫抓收费图片_简单的抓取淘宝图片的Python爬虫

    写了一个抓taobao图片的爬虫,全是用if,for,while写的,比较简陋,入门作品. 从网页http://mm.taobao.com/json/request_top_list.htm?type ...

  3. 420集的python教程视频_阿里达摩院推的420集的python教程高清版,据说懂中文就能入门...

    阿里达摩院推的400集的python教程高清版,据说懂中文就能入门 小编的内心是强大的,网友虐我千百遍,我待网友如初恋,因为今天又给大家带来了干货,Python入门教程完整版,完整版啊!完整版! 为了 ...

  4. python刷火车票_五一要来了,教你用Python动刷新抢12306火车票,附源码

    2020年时间飞逝,转眼间马上要到五一了,还在为抢不到火车票发愁吗?作为程序员的我们撸一个抢票软件可好? ... 难以想象的数据, 预示着今年春运回程和返程车票 购买难度将进一步加大... 抢购车票怕 ...

  5. python orm库_周边生态贡献者+1,一个TDengine的Python ORM库—crown

    本文介绍了一个用于操作TDengine的 Python ORM库.本文的预期读者是,需要使用Python语言操作TDengine数据库的开发人员. 什么是ORM? ORM就是对象关系映射(Object ...

  6. python原理视频教程_让你见识一下什么叫真正的Python学习路线+系统的视频教程...

    虽说年年都在喊互联网寒冬,最难就业季,但是今年确实有点不一样,年前年后一波又一波互联网公司宣布"人员调整,结构优化", 这是往年没发生过的. 是不是面试机会就少了很多呢?不是的. ...

  7. python简单编程语言_功能强大而又简单易学的编程语言Python

    Python是一种面向对象.直译式计算机程序设计语言,也是一种功能强大的通用型语言(维基百科).自从上次写那个批量Blast小程序的时候接触了Python,发现这个玩意儿真是好用,后来还用它弄了个动态 ...

  8. python装逼_能够让你装逼的10个Python小技巧

    列表推导式 你有一个list: bag = [1, 2, 3, 4, 5] 现在你想让所有元素翻倍,让它看起来是这个样子: [2, 4, 6, 8, 10] 大多初学者,根据之前语言的经验会大概这样来 ...

  9. excel运行python自定义函数_终于,可以在Excel中直接使用Python!

    大家好,我是早起. 经常给大家推荐好用的数据分析工具,也收到了铁子们的各种好评.这次也不例外,我要再推荐一个,而且是个爆款神器. Excel和Jupyter Notebok都是我每天必用的工具,而且两 ...

最新文章

  1. ipad无法与itunes同步,提示因为这台电脑不再被授权使用在此ipad上购买的项目解决方案...
  2. AUTOVC: Zero-Shot Voice Style Transfer with Only Autoencoder Loss笔记
  3. Python基础:第一个Python程序(2)
  4. 编程学习初体验(4. 编程的核心)
  5. 本地git首次连接远程github仓库
  6. Boost.Python Tutorial
  7. [渝粤教育] 西北工业大学 机械原理 参考 资料
  8. java moneyutils_java中每月等额与先息后本计算
  9. 你的个人信息是如何被盗走的?MySQL脱库,脱库的原理,怎么脱库,脱库的步骤,一库三表六字段
  10. linux 联合编译,在Linux上编译UEFI SDK 2018/OVMF的方法
  11. 管壁式换热器cad图纸_一文详解换热器技术问答,真的都是珍藏版!
  12. 在存储过程中动态创建临时表
  13. 独立之精神,自由之思想
  14. 【HTCVR】VRTK插件模块功能分析之传送移动(二)
  15. Win7 easy connect 提示:选路连接失败,可能当前连接网络异常,请稍后重试
  16. Druid 介绍和应用
  17. RPA初级认证直通车,不懂代码也能成为技术大佬
  18. 区块链中的merkle树有何作用?
  19. 【Python】使用Docker部署Python项目
  20. 2017年阿里Java面试基础题

热门文章

  1. python 中 yield 的使用
  2. Linux 系统调用 Ptrace 详解
  3. Microsoft Visual Studio Code
  4. Linux 文件 IO
  5. .pfx 证书和 .cer 证书
  6. PostgreSQL 分页——示例
  7. mysql 半同步 配置_Mysql 半同步复制配置
  8. C#灰度图转伪彩色图
  9. leetcode 贪心_贪心算法:给我最好的,现在就要!
  10. java执行python返回null_[转]java调用python脚本以及通过Process.waitFor()直接调用python模块返回错误代码1的一种解决办法...