本文来自网易云社区

作者:王贝

小学生现在都在学python了,作为专业程序员当然不能落下了,所以,快马加鞭,周六周末在家学起了python3,python3的基本语法比较简单,相比于Java开发更加敏捷,python3的基础就不讲了,这里主要讲下我这里的爬虫小程序的实现逻辑吧

上下模块图:

一目了然,总体上就是这5步,涉及到python3的requests,bs4,re,sqlalchemy这四个模块。

(1)requests:

是一个很强大的http客户端库,提供了丰富的api,比如发一个get请求:

with requests.get(url,params={},headers={}) as rsp:res.text   #返回值文本内容复制代码

发一个入参为json的post请求:

with requests.post(url,json={},headers={}) as rsp:res.text #返回值文本内容复制代码

等等。

这里值得说一下,为什么用with as,with会先执行__enter__()方法,其返回值就是as,requests里返回值就是rsp,当with as 这一逻辑行执行结束时,就会执行__exit__()方法,requests里__exit__()方法将request close掉了,这就是程序没有显示调用close的原因。下面程序里会有一个例子彰显with as的功能。

requests还有很多强大的功能,参考:https://www.cnblogs.com/lilinwei340/p/6417689.html。

(2)bs4 BeatifulSoup

学过java的都知道java有个jsoup,jsoup就是对html模版进行解析,变成各个标签集合,这里bs4和jsoup如出一辙,api也基本一致,比如,一下html代码,我们想获取新闻,地图,视频,贴吧 这些内容,只要:

soup=BeautifulSoup(html,'html.parser')
atags=soup.find('div',{'id':'u1'}).findChilren('a',{'class':'mnav'})
values=[]for atag in atags:values.append(atag.text)复制代码

以上程序即可实现我们的要求,python解析html的还有一个scrapy框架的xpath,以后分享scrapy时再讲。

<html>
<head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head>
<body link=#0000cc>
<div id=wrapper><div id=head><div >            <div >                <div >                    <div id=lg><img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129></div><form id=form name=f action=//www.baidu.com/s >                        <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hiddenname=rsv_bpvalue=1><input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span><input id=kw name=wd >                                                           autocomplete=off autofocus></span><span><input type=submit id=su value=百度一下 ></span></form></div></div><div id=u1><a href=http://news.baidu.com name=tj_trnews >                                                                                         name=tj_trhao123 >                <a href=http://map.baidu.com name=tj_trmap >                                                                                >                        href=http://tieba.baidu.com name=tj_trtieba >                <noscript><ahref=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1name=tj_login >                <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=' + encodeURIComponent(window.location.href + (window.location.search === "" ? "?" : "&") + "bdorz_come=1") + '" name="tj_login" >登录</a>');</script><a href=//www.baidu.com/more/ name=tj_briicon >        </div></div><div id=ftCon><div id=ftConw><p id=lh><a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a></p><p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>使用百度前必读</a>  <ahref=http://jianyi.baidu.com/ >                    src=//www.baidu.com/img/gs.gif></p></div></div>
</div>
</body>
</html>复制代码

(3) re

re正则模块很强大,有match search sub replace这些api,每个都有自己的特长,可以参考:http://www.runoob.com/python3/python3-reg-expressions.html

(4) sqlalchemy

一款python的数据库orm框架,用了下,很好用,有点类似于java 的hibernate,但更灵活。

说了这么多,该帖下爬虫脚本的代码了,下面是目录结构,毕竟也是专业程序员,不能写的一团糟,也要讲究架构,哈哈。

------youku_any #包名

--------------datasource.py #专门管理数据源session

--------------youkubannerdao.py #程序里抓取的优酷banner信息,这个是dao层

--------------youkuservice.py #不用说了,业务逻辑

还有一件事情,就是建表,不多说了:

CREATE TABLE `youku_banner` (  `id` bigint(22) NOT NULL AUTO_INCREMENT,  `type` int(2) NOT NULL, #优酷banner类型 1:电视 2:电影 3.综艺 `year` int(4) NOT NULL,  `month` int(2) NOT NULL,  `date` int(2) NOT NULL,  `hour` int(2) NOT NULL,  `minute` int(2) NOT NULL,  `img` varchar(255) DEFAULT NULL,  `title` varchar(255) DEFAULT NULL,  `url` varchar(255) DEFAULT NULL,  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  PRIMARY KEY (`id`),  KEY `idx_uniq` (`year`,`month`,`date`,`hour`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=83 DEFAULT CHARSET=utf8mb4复制代码

接下来就是代码实现了:

datasource.py

from sqlalchemy import create_enginefrom sqlalchemy.orm import sessionmakerdburl = 'mysql+pymysql://root:123@localhost/youku?charset=utf8'#pool_size 置为100 session回收时间3600sds = create_engine(dburl,pool_size=100,pool_recycle=3600)Session = sessionmaker(bind=ds)# session=Session()#创建session管理类class SessionManager():def __init__(self):self.session=Session()    def __enter__(self):return self.session    #连接池管理session,不需要显示closedef __exit__(self, exc_type, exc_val, exc_tb):# session.close()print('not close')复制代码

youkubannerdao.py

from sqlalchemy import Sequence, Column, Integer, BigInteger, String, TIMESTAMP, textfrom sqlalchemy.ext.declarative import declarative_basefrom youku_any.datasource import SessionManagerBase = declarative_base()#继承基类Baseclass YoukuBanner(Base):#指定表名__tablename__ = 'youku_banner'#定义字段映射关系id = Column(BigInteger, Sequence('id'), primary_key=True)type=Column(Integer)year = Column(Integer)month = Column(Integer)date = Column(Integer)hour = Column(Integer)minute = Column(Integer)img = Column(String(255))title = Column(String(255))url = Column(String(255))createTime = Column('create_time', TIMESTAMP)    def add(self):#with as 先执行SessionManager __enter__() 逻辑行结束执行__exit()__with SessionManager() as session:            try:session.add(self)session.commit()            except:session.rollback()    def addBatch(self,values):with SessionManager() as session:            try:session.add_all(values)session.commit()            except:session.rollback()    def select(self,param):with SessionManager() as session:            return session.query(YoukuBanner).select_from(YoukuBanner).filter(param)    def remove(self,parma):with SessionManager() as session:            try:session.query(YoukuBanner).filter(parma).delete(synchronize_session='fetch')session.commit()            except:session.rollback()    def update(self,param,values):with SessionManager() as session:            try:session.query(YoukuBanner).filter(param).update(values, synchronize_session='fetch')session.commit()            except:session.rollback()复制代码

youkuservice.py

import requestsimport jsonimport reimport datetimefrom bs4 import BeautifulSoupfrom sqlalchemy import textfrom youku_any.youkubannerdao import YoukuBannerdef getsoup(url):with requests.get(url, params=None, headers=None) as req:        if req.encoding != 'utf-8':encodings = requests.utils.get_encodings_from_content(req.text)            if encodings:encode = encodings[0]            else:encode = req.apparent_encodingencode_content = req.content.decode(encode).encode('utf-8')soup = BeautifulSoup(encode_content, 'html.parser')        return soupdef getbanner(soup):# soup = BeautifulSoup()# soup.findChild()bannerDivP = soup.find('div', {'id': 'm_86804', 'name': 'm_pos'})bannerScript = bannerDivP.findChildren('script', {'type': 'text/javascript'})[1].textm = re.search('\[.*\]', bannerScript)banners = json.loads(m.group())    for banner in banners:time = datetime.datetime.now()youkubanner = YoukuBanner(type=1, year=time.year, month=time.month, date=time.day, hour=time.hour,minute=time.minute,img=banner['img'], title=banner['title'], url=banner['url'])youkubanner.add()soup=getsoup('http://tv.youku.com/')
getbanner(soup)youkuBanner = YoukuBanner()
youkuBanner.remove(parma=text('id=67 or id=71'))
youkuBanner.update(param=text('id=70'),values={'title':YoukuBanner.title + '呼啸山庄'})for i in range(0,10000):youkuBanner.update(param=text('id=70'), values={'title': YoukuBanner.title + '呼啸山庄'})bannerList = youkuBanner.select(param=text('id > 66 and id < 77 order by id asc limit 0,7'))print("lines--------%d" % i)    # time.sleep(10)for banner in bannerList:print(banner.id,banner.minute,banner.img,banner.title)复制代码

到此,一个简答的爬虫脚本就写完了,周末两天的成果还是有点小满足,不过这只是python的冰山一脚,还有好多等着我们去探讨呢。

网易云免费体验馆,0成本体验20+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区。

相关文章:
【推荐】 责任链模式的使用-Netty ChannelPipeline和Mina IoFilterChain分析

Python3下基于bs4和sqlalchemy的爬虫实现相关推荐

  1. python scapy 抓包_Python3下基于Scapy库完成网卡抓包解析

    Scapy是一个可以让用户发送.侦听和解析并伪装网络报文的Python程序.这些功能可以用于制作侦测.扫描和攻击网络的工具. 在 Python 代码中可以通过 sniff 函数调用抓包分析,并对抓到的 ...

  2. python3异步协程爬虫_Python实现基于协程的异步爬虫

    Python实现基于协程的异步爬虫 一.课程介绍 1. 课程来源 本课程核心部分来自<500 lines or less>项目,作者是来自 MongoDB 的工程师 A. Jesse Ji ...

  3. Windows下基于python3使用word2vec训练中文维基百科语料资料汇总

    Windows下基于python3使用word2vec训练中文维基百科语料(一):https://www.cnblogs.com/gaofighting/p/9055674.html Windows下 ...

  4. Python3 bs4 + requests 简单的爬虫 爬取LOL胜率加点

    Python Bs4 + request 简单的爬虫 很早之前的python写着玩的东西,如果爬一些简单的东西,还用不到scrapy之类的爬虫框架 #!/usr/bin/env python # -* ...

  5. python3下scrapy爬虫(第二卷:初步抓取网页内容之直接抓取网页)

    上一卷中介绍了安装过程,现在我们开始使用这个神奇的框架 跟很多博主一样我也先选择一个非常好爬取的网站作为最初案例,那么我先用屌丝必备网站http://www.shaimn.com/xinggan/作为 ...

  6. smtp在线发送邮件_基于树莓派3B,利用爬虫、SMTP和发送邮件amp;amp;(爬取墨迹天气预报信息)...

    转载请注明: 利用爬虫.SMTP和树莓派3B发送邮件&续集&(爬取墨迹天气预报信息) - 永怀一颗学徒的心 - 博客园​www.cnblogs.com ZXPXBB:基于树莓派3B,利 ...

  7. 基于Python实现的网络爬虫项目——多线程下载小说并保存为txt文件(包含完整代码及注释)

    基于Python实现的网络爬虫项目--多线程下载小说并保存为txt文件(包含完整代码及注释) 一.确立预期目标 二.完成项目所需工具 三.项目需要解决的问题 问题一 问题二 问题三 问题四 问题五 问 ...

  8. python异步爬虫_Python实现基于协程的异步爬虫

    Python实现基于协程的异步爬虫 一.课程介绍 1. 课程来源 本课程核心部分来自<500 lines or less>项目,作者是来自 MongoDB 的工程师 A. Jesse Ji ...

  9. python3制作捧腹网段子页爬虫

    0x01 春节闲着没事(是有多闲),就写了个简单的程序,来爬点笑话看,顺带记录下写程序的过程.第一次接触爬虫是看了这么一个帖子,一个逗逼,爬取煎蛋网上妹子的照片,简直不要太方便.于是乎就自己照猫画虎, ...

最新文章

  1. 嵌入式系统学习笔记之五-- uboot常用命令 环境变量
  2. java 之 网络编程
  3. linux 瘦客户机系统,2X ThinClientOS基于Linux的瘦客户端系统 | MOS86
  4. linux vim复制和粘贴
  5. dict过滤 python_小猿圈解析Python开发的技巧都有哪些?
  6. 普通电脑能做成瘦客户机吗_阿里云的“无影”云电脑,能不能真的代替传统电脑...
  7. C#获得计算机名,当前登录用户名,Ip地址 .
  8. 使用Canvas基于手势可以使树秋千
  9. .Net中的AOP系列之《单元测试切面》
  10. 关于使用UE编辑器无法初始化ftp的问题
  11. 图像格式(YUYV)
  12. 图片处理--处理成灰色图片,高斯模糊
  13. HTML基础笔记——head标签
  14. FreePascal - Typhon在Windows10 X64下的使用问题!
  15. 新电脑配置显卡驱动及CUDA、CUDNN环境
  16. 在pb中实现声音文件的播放
  17. 前端页面中的iframe框架的实践
  18. 案例学习-万事达卡全球业务服务中心(GBSC)
  19. LiquiBase 管理数据库变更实践
  20. 〖产品思维训练白宝书 - 核心竞争力篇⑪〗- 产品经理核心竞争力解读之管理能力

热门文章

  1. 微信小程序开发(1)—— 微信小程序申请注册提交审核并发布详细流程
  2. 小半计算机谱子,小半 钢琴谱-陈粒
  3. wince 访问共享文件_WINCE6.0建立共享文件夹
  4. 布城:马来西亚新行政中心的崛起之路
  5. 基于Web的系统测试方法(张友生(来自中国系统分析师/中国系统分析员))
  6. android开启服务应用禁止被杀死,Android Service服务如何不被杀死
  7. 从一位阿里 P9 的年薪和资产聊起!
  8. 团体思维创意游戏1:人体风暴
  9. 多个Word文档,多张图片转PDF方式实现
  10. caida的测量工具scamper