最近在学习Python,给本身找了一个任务,作网站文章的爬虫小项目。html
项目用的BeautifulSoup4和chardet模块属于三方扩展包,若是没有请自行pip安装,我是用pycharm来作的安装,下面简单讲下用pycharm安装chardet和BeautifulSoup4html5
在pycharm的设置里按照下图的步骤操做 正则表达式
以下图搜索你要的扩展类库,如咱们这里须要安装chardet直接搜索就行,而后点击install package, BeautifulSoup4作同样的操做就行数据库
咱们这里以抓取简书首页为例:www.jianshu.com/api
# 简单的网络爬虫
from urllib import request
import chardet
response = request.urlopen("http://www.jianshu.com/")
html = response.read()
charset = chardet.detect(html)# {'language': '', 'encoding': 'utf-8', 'confidence': 0.99}
html = html.decode(str(charset["encoding"])) # 解码
print(html)
复制代码
因为抓取的html文档比较长,这里简单贴出来一部分给你们看下bash
<!DOCTYPE html>
<!--[if IE 6]><html class="ie lt-ie8"><![endif]-->
<!--[if IE 7]><html class="ie lt-ie8"><![endif]-->
<!--[if IE 8]><html class="ie ie8"><![endif]-->
<!--[if IE 9]><html class="ie ie9"><![endif]-->
<!--[if !IE]><!--> <html> <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0,user-scalable=no">
<!-- Start of Baidu Transcode -->
<meta http-equiv="Cache-Control" content="no-siteapp" />
<meta http-equiv="Cache-Control" content="no-transform" />
<meta name="applicable-device" content="pc,mobile">
<meta name="MobileOptimized" content="width"/>
<meta name="HandheldFriendly" content="true"/>
<meta name="mobile-agent" content="format=html5;url=http://localhost/">
<!-- End of Baidu Transcode -->
<meta name="description" content="简书是一个优质的创做社区,在这里,你能够任性地创做,一篇短文、一张照片、一首诗、一幅画……咱们相信,每一个人都是生活中的艺术家,有着无穷的创造力。">
<meta name="keywords" content="简书,简书官网,图文编辑软件,简书下载,图文创做,创做软件,原创社区,小说,散文,写做,阅读">
..........后面省略一大堆
复制代码
这就是Python3的爬虫简单入门,是否是很简单,建议你们多敲几遍网络
目标app
import re
import urllib.request
#爬取网页html
def getHtml(url):
page = urllib.request.urlopen(url)
html = page.read()
return html
html = getHtml("http://tieba.baidu.com/p/3205263090")
html = html.decode('UTF-8')
#获取图片连接的方法
def getImg(html):
# 利用正则表达式匹配网页里的图片地址
reg = r'src="([.*\S]*\.jpg)" pic_ext="jpeg"'
imgre=re.compile(reg)
imglist=re.findall(imgre,html)
return imglist
imgList=getImg(html)
imgCount=0
#for把获取到的图片都下载到本地pic文件夹里,保存以前先在本地建一个pic文件夹
for imgPath in imgList:
f=open("../pic/"+str(imgCount)+".jpg",'wb')
f.write((urllib.request.urlopen(imgPath)).read())
f.close()
imgCount+=1
print("所有抓取完成")
复制代码
火烧眉毛的看下都爬取到了些什么美图ide
就这么轻易的爬取到了24个妹子的图片。是否是很简单。学习
到这里稍微复杂点,就分布给你们讲解
这里就要用到咱们导入的BeautifulSoup4库了,这里的关键代码
# 使用剖析器为html.parser
soup = BeautifulSoup(html, 'html.parser')
# 获取到每个class=hot-article-img的a节点
allList = soup.select('.hot-article-img')
复制代码
上面代码获取到的allList就是咱们要获取的新闻列表,抓取到的以下
[<div class="hot-article-img">
<a href="/article/211390.html" target="_blank">

</a>
</div>, <div class="hot-article-img">
<a href="/article/214982.html" target="_blank" title="TFBOYS成员各自飞,商业价值天花板已现?">
<!--视频和图片保留一个-->

</a>
</div>, <div class="hot-article-img">
<a href="/article/213703.html" target="_blank" title="买手店江湖">
<!--视频和图片保留一个-->

</a>
</div>, <div class="hot-article-img">
<a href="/article/214679.html" target="_blank" title="iPhone X正式告诉咱们,手机和相机开始分道扬镳">
<!--视频和图片保留一个-->

</a>
</div>, <div class="hot-article-img">
<a href="/article/214962.html" target="_blank" title="信用已被透支殆尽,乐视汽车或成贾跃亭弃子">
<!--视频和图片保留一个-->

</a>
</div>, <div class="hot-article-img">
<a href="/article/214867.html" target="_blank" title="别小看“搞笑诺贝尔奖”,要向好奇心致敬">
<!--视频和图片保留一个-->

</a>
</div>, <div class="hot-article-img">
<a href="/article/214954.html" target="_blank" title="10 年前改变世界的,可不止有 iPhone | 发车">
<!--视频和图片保留一个-->

</a>
</div>, <div class="hot-article-img">
<a href="/article/214908.html" target="_blank" title="感谢微博替我作主">
<!--视频和图片保留一个-->

</a>
</div>, <div class="hot-article-img">
<a href="/article/215001.html" target="_blank" title="苹果确认取消打赏抽成,但还有多少内容让你以为值得掏腰包?">
<!--视频和图片保留一个-->

</a>
</div>, <div class="hot-article-img">
<a href="/article/214969.html" target="_blank" title="中国音乐的“全面付费”时代即将到来?">
<!--视频和图片保留一个-->

</a>
</div>, <div class="hot-article-img">
<a href="/article/214964.html" target="_blank" title="百丽退市启示录:“一代鞋王”如何与新生代消费者渐行渐远">
<!--视频和图片保留一个-->

</a>
</div>]
复制代码
这里数据是抓取到了,可是太乱了,而且还有不少不是咱们想要的,下面就经过遍从来提炼出咱们的有效信息
#遍历列表,获取有效信息
for news in allList:
aaa = news.select('a')
# 只选择长度大于0的结果
if len(aaa) > 0:
# 文章连接
try:#若是抛出异常就表明为空
href = url + aaa[0]['href']
except Exception:
href=''
# 文章图片url
try:
imgUrl = aaa[0].select('img')[0]['src']
except Exception:
imgUrl=""
# 新闻标题
try:
title = aaa[0]['title']
except Exception:
title = "标题为空"
print("标题",title,"\nurl:",href,"\n图片地址:",imgUrl)
print("==============================================================================================")
复制代码
这里添加异常处理,主要是有的新闻可能没有标题,没有url或者图片,若是不作异常处理,可能致使咱们爬取的中断。
标题 标题为空
url: https://www.huxiu.com/article/211390.html
图片地址: https://img.huxiucdn.com/article/cover/201708/22/173535862821.jpg?imageView2/1/w/280/h/210/|imageMogr2/strip/interlace/1/quality/85/format/jpg
==============================================================================================
标题 TFBOYS成员各自飞,商业价值天花板已现?
url: https://www.huxiu.com/article/214982.html
图片地址: https://img.huxiucdn.com/article/cover/201709/17/094856378420.jpg?imageView2/1/w/280/h/210/|imageMogr2/strip/interlace/1/quality/85/format/jpg
==============================================================================================
标题 买手店江湖
url: https://www.huxiu.com/article/213703.html
图片地址: https://img.huxiucdn.com/article/cover/201709/17/122655034450.jpg?imageView2/1/w/280/h/210/|imageMogr2/strip/interlace/1/quality/85/format/jpg
==============================================================================================
标题 iPhone X正式告诉咱们,手机和相机开始分道扬镳
url: https://www.huxiu.com/article/214679.html
图片地址: https://img.huxiucdn.com/article/cover/201709/14/182151300292.jpg?imageView2/1/w/280/h/210/|imageMogr2/strip/interlace/1/quality/85/format/jpg
==============================================================================================
标题 信用已被透支殆尽,乐视汽车或成贾跃亭弃子
url: https://www.huxiu.com/article/214962.html
图片地址: https://img.huxiucdn.com/article/cover/201709/16/210518696352.jpg?imageView2/1/w/280/h/210/|imageMogr2/strip/interlace/1/quality/85/format/jpg
==============================================================================================
标题 别小看“搞笑诺贝尔奖”,要向好奇心致敬
url: https://www.huxiu.com/article/214867.html
图片地址: https://img.huxiucdn.com/article/cover/201709/15/180620783020.jpg?imageView2/1/w/280/h/210/|imageMogr2/strip/interlace/1/quality/85/format/jpg
==============================================================================================
标题 10 年前改变世界的,可不止有 iPhone | 发车
url: https://www.huxiu.com/article/214954.html
图片地址: https://img.huxiucdn.com/article/cover/201709/16/162049096015.jpg?imageView2/1/w/280/h/210/|imageMogr2/strip/interlace/1/quality/85/format/jpg
==============================================================================================
标题 感谢微博替我作主
url: https://www.huxiu.com/article/214908.html
图片地址: https://img.huxiucdn.com/article/cover/201709/16/010410913192.jpg?imageView2/1/w/280/h/210/|imageMogr2/strip/interlace/1/quality/85/format/jpg
==============================================================================================
标题 苹果确认取消打赏抽成,但还有多少内容让你以为值得掏腰包?
url: https://www.huxiu.com/article/215001.html
图片地址: https://img.huxiucdn.com/article/cover/201709/17/154147105217.jpg?imageView2/1/w/280/h/210/|imageMogr2/strip/interlace/1/quality/85/format/jpg
==============================================================================================
标题 中国音乐的“全面付费”时代即将到来?
url: https://www.huxiu.com/article/214969.html
图片地址: https://img.huxiucdn.com/article/cover/201709/17/101218317953.jpg?imageView2/1/w/280/h/210/|imageMogr2/strip/interlace/1/quality/85/format/jpg
==============================================================================================
标题 百丽退市启示录:“一代鞋王”如何与新生代消费者渐行渐远
url: https://www.huxiu.com/article/214964.html
图片地址: https://img.huxiucdn.com/article/cover/201709/16/213400162818.jpg?imageView2/1/w/280/h/210/|imageMogr2/strip/interlace/1/quality/85/format/jpg
==============================================================================================
复制代码
到这里咱们抓取新闻网站新闻信息就大功告成了,下面贴出来完整代码
from bs4 import BeautifulSoup
from urllib import request
import chardet
url = "https://www.huxiu.com"
response = request.urlopen(url)
html = response.read()
charset = chardet.detect(html)
html = html.decode(str(charset["encoding"])) # 设置抓取到的html的编码方式
# 使用剖析器为html.parser
soup = BeautifulSoup(html, 'html.parser')
# 获取到每个class=hot-article-img的a节点
allList = soup.select('.hot-article-img')
#遍历列表,获取有效信息
for news in allList:
aaa = news.select('a')
# 只选择长度大于0的结果
if len(aaa) > 0:
# 文章连接
try:#若是抛出异常就表明为空
href = url + aaa[0]['href']
except Exception:
href=''
# 文章图片url
try:
imgUrl = aaa[0].select('img')[0]['src']
except Exception:
imgUrl=""
# 新闻标题
try:
title = aaa[0]['title']
except Exception:
title = "标题为空"
print("标题",title,"\nurl:",href,"\n图片地址:",imgUrl)
print("==============================================================================================")
复制代码
数据获取到了咱们还要把数据存到数据库,只要存到咱们的数据库里,数据库里有数据了,就能够作后面的数据分析处理,也能够用这些爬取来的文章,给app提供新闻api接口,固然这都是后话了
by:年糕妈妈邱石