@[TOC](Html 分析目录:)
HTML 和 网站是什么关系?
HTML 是一种超文本语言,是用来编写前端网站的语言之一。我们也俗话把HTML 称之为 网站,网页。
如何分析网站:
在这里我们拿 上节课 《第7课: bs4 库 的 BeautifulSoup 基础学习》 的作业来做一个例子。
上节课的作业是 爬去 搜狐新闻的 文章标题。搜索网站网址:http://news.sohu.com/
分析网站用到的第一个工具:就是浏览器自带的 调试工具。我这里默认使用的是谷歌浏览器,我建议大家也使用 谷歌浏览器。
首先,我们要打开这个网站,进入到首页后,需要 按<font color=#DC143C> F12</font> ,进入到调试模式。
按 F12 ,进入到调试模式,如下图。
然后我们可以看到一些代码,还有一个行工具栏。
工具栏中有 Elements ,Console ,Sourecs,Nerword,Perfornance,Memory,Application,Security,Lighthouse 。这些工具栏目。
爬虫需要的栏目名称 | 作用解释 |
---|---|
Elements | 主要是用来查看需要爬去的数据的 HTML 标签 属性等信息 |
Nerword | 【爬虫最重要的】查看网站加载了 json文件,html 文件,媒体文件等等 |
其他的你们也不需要了解了,主要就是这四个,四个钟,重要的是 Elements 和 Nerword 这两个功能作用。
Elements 的使用:
1,打开浏览器进入 网站:http://news.sohu.com/ ,然后按 F12 ,点击 浏览器的 Elements 。
点击Elements ,我们就可以看到这个网站的一些 HTML 源码。
比如我们需要爬去网站的标题,我们就需要用到 这个工具栏的最 左侧的 箭头。
如下动态图【先点击箭头,在点击你需要爬去的标题,我们就可以快速定位到需要爬去的标题所属的HTM代码啦】:
快速定位到标题 所在的 HTML 代码后,我们就需要分析这个代码。
分析HTML 代码:
代码截图如下:
我将 上面的代码复制了出来,代码如下:
<a data-param="_f=index_chan08news_1"
href="https://www.sohu.com/a/433526374_115362?spm=smpc.news-home.top-news2.2.1606033856144w4nUMI3"
target="_blank"
title="天津人冒严寒抗疫 网友却被“赞上海贬天津”图片带节奏"
data-spm-data="2">
天津人冒严寒抗疫 网友却被“赞上海贬天津”图片带节奏
</a>
根据上节课 《第7课: bs4 库 的 BeautifulSoup 基础学习》的学习 HTML <font color=#DC143C><标签名 属性名=“属性值”> 内容 </标签名> </font>。
html 代码 | 解释 |
---|---|
a | 标签 |
data-param | 标签的属性名称,= 号后面的是属性值 |
href | 标签的属性名称,= 号后面的是属性值 |
target | 标签的属性名称,= 号后面的是属性值 |
title | 标签的属性名称,= 号后面的是属性值 |
data-spm-data | 标签的属性名称,= 号后面的是属性值 |
我们可以看到 a 标签属性有很多,data-param ,href ,target,title,data-spm-data 这些都是标签的属性。
html 的标签属性名分析:
在得到了 HTML 的标签,属性 后,我们就需要那些是能用在 BeautifulSoup 的 find_all 中。
标签属性名 | 分析 |
---|---|
data-param | 属性名出现 - 横杆的,在python 中是不支持的。【不可用,会直接报错】 |
href | 未出现不合规的命名规范,可以使用 |
target | 未出现不合规的命名规范,可以使用 |
title | 未出现不合规的命名规范,可以使用 |
data-spm-data | 属性名出现 - 横杆的,在python 中是不支持的。【不可用】 |
当我们知道了这个标题是的 HTML 可用属性后【我们只需要其中一个即可】,我们就可以用 BeautifulSoup 的 find_all 去爬去看是否能爬取到?
find_all 使用格式如下: <font color=#DC143C> info = content.find_all(“标签”,属性名称=“属性值”)</font> 代码 |
解释 |
---|---|
content | 就是 content = BeautifulSoup(requ.text,'lxml') |
find_all | BeautifulSoup 类 中 的一个 函数 功能是查找所有 |
info | content.find_all(“标签”,属性名称=“属性值”) 的名字 |
把 href 属性和属性值写入代码如下:
#encoding:utf-8
import requests
from bs4 import BeautifulSoup
requ = requests.get('http://news.sohu.com/')
content = BeautifulSoup(requ.text,'lxml')
info = content.find_all('a',href="https://www.sohu.com/a/433526374_115362?spm=smpc.news-home.top-news2.2.1606033856144w4nUMI3")
print(info)
得到结果如下:
D:\pro_py\venv\Scripts\python.exe D:/pro_py/教育学习/7.py
[]
Process finished with exit code 0
是一个空列表,并没有的到数据。
把 target 属性和属性值写入代码如下:
#encoding:utf-8
import requests
from bs4 import BeautifulSoup
requ = requests.get('http://news.sohu.com/')
content = BeautifulSoup(requ.text,'lxml')
info = content.find_all('a',target="_blank")
print(info)
得到结果如下:
[<a href="http://news.sohu.com/s2018/guoqing69/index.shtml" target="_blank"></a>, <a href="http://news.sohu.com/" target="_blank">新闻首页</a>, <a href="http://mp.sohu.com" target="_blank">
<li class="link shh">
<div class="icon"></div>
<div class="title">搜狐号</div>
</li>
</a>, <a href="https://www.sogou.com" target="_blank">
<li class="link sougou">
<div class="icon"></div>
<div class="title">搜狗搜索</div>
</li>
</a>, <a href="https://mail.sohu.com" target="_blank">
<li class="link sohu_email">
<div class="icon"></div>
<div class="title">搜狐邮箱</div>
</li>
</a>, <a href="http://www.sohu.com" target="_blank">首页</a>, <a href="http://www.sohu.com/c/8/1460" target="_blank">时政</a>, <a href="http://www.sohu.com/c/8/1461" target="_blank">国际</a>, <a href="http://mil.sohu.com/" target="_blank">军事</a>, <a href="http://police.news.sohu.com/" target="_blank">警法</a>, <a href="http://www.sohu.com/subject" target="_blank">专题</a>, <a href="http://gongyi.sohu.com/" target="_blank">公益</a>, <a href="http://wrj.sohu.com" target="_blank">无人机</a>, <a href="http://mp.sohu.com/profile?xpt=bGFubGFuZGUyMkBzb2h1LmNvbQ==" target="_blank">狐度</a>, <a href="http://mp.sohu.com/profile?xpt=NzJCMERBNUNDN0NEODJBOTkwMTZFMkM2NkU3REM3QjBAcXEuc29odS5jb20=" target="_blank">数字之道</a>, <a href="http://mp.sohu.com/profile?xpt=ZmVpbHUyMTAxMjdAc29odS1pbmMuY29t" target="_blank">知世</a>, <a href="http://mp.sohu.com/profile?xpt=c29odXptdHo1eXk3cEBzb2h1LmNvbQ==" target="_blank">神吐槽</a>, <a data-param="_f=index_chan08focus_0" href="https://www.sohu.com/a/433548388_362042" target="_blank" title="河南滨淮“货车撞送葬人群”事故引关注 有沙石货车被指“可按月买通行证”">
<img alt="" src="http://29e5534ea20a8.cdn.sohucs.com/c_fill,w_320,h_213,g_faces/c_cut,x_0,y_0,w_600,h_400/os/news/b2db2ede84656c641487a71508264de8.jpg"/>
<span class="linear-box">
<em class="linear-bg"></em>
<em class="linear-txt">河南滨淮“货车撞送葬人群”事故引关注 有沙石货车被指“可按月买通行证”</em>
</span>
</a>, <a data-param="_f=index_chan08focus_1" href="https://www.sohu.com/a/433479812_162758" target="_blank" title="1500万年前的枣被发现 网友:好吃吗?">
<img alt="" src="http://29e5534ea20a8.cdn.sohucs.com/c_fill,w_155,h_103,g_faces/c_cut,x_0,y_0,w_445,h_297/c_cut,x_-5,y_0,w_456,h_304/os/news/16df958d7180d1b5f4b14c86e63df866.jpg"/>
<span class="txt">1500万年前的枣被发现 网友:好吃吗?</span>
</a>, <a data-param="_f=index_chan08focus_2" href="https://www.sohu.com/a/433537687_162758" target="_blank" title="这地方发生“怪事”,天没亮就有人扔钱进来">
<img alt="" src="http://29e5534ea20a8.cdn.sohucs.com/c_fill,w_155,h_103,g_faces/c_cut,x_0,y_0,w_600,h_400/os/news/c582b256589bf94b5cf1c8af2d4ad351.jpg"/>
<span class="txt">这地方发生“怪事”,天没亮就有人扔钱进来</span>
</a>, <a data-clev="10220169" data-site="2" data-title="62岁大妈嫁26岁小伙" data-vid="224843656" data-video-clicker="video3" href="javascript:void(0)" target="_blank" title="62岁大妈嫁26岁小伙"><img alt="" src="http://29e5534ea20a8.cdn.sohucs.com/c_fill,w_320,h_160,g_faces/c_cut,x_0,y_0,w_320,h_160/os/news/984d02038d2ddb879c1d45a1116baacc.jpg"/><span class="linear-box video-txt"><em class="linear-bg"></em><em class="txt">62岁大妈嫁26岁小伙</em></span><i class="icon icon-video"></i></a>, <a data-clev="10220170" data-site="2" data-title="广东一男子深夜被“浸猪笼” 全程求饶痛哭" data-vid="224848320" data-video-clicker="video3" href="javascript:void(0)" target="_blank" title="广东一男子深夜被“浸猪笼” 全程求饶痛哭"><i class="icon icon-video"></i>广东一男子深夜被“浸猪笼” 全程求饶痛哭</a>, <a data-clev="10220171" data-site="2" data-title="女儿倾慕男子为其醉驾顶包 父亲陪她去自首" data-vid="224847638" data-video-clicker="video3" href="javascript:void(0)" target="_blank" title="女儿倾慕男子为其醉驾顶包 父亲陪她去自首"><i class="icon icon-video"></i>女儿倾慕男子为其醉驾顶包 父亲陪她去自首</a>, <a data-clev="10220172" data-site="2" data-title="小伙边开车边高歌 下一秒忘词看手机酿事故" data-vid="224914820" data-video-clicker="video3" href="javascript:void(0)" target="_blank" title="小伙边开车边高歌 下一秒忘词看手机酿事故"><i class="icon icon-video"></i>小伙边开车边高歌 下一秒忘词看手机酿事故</a>, <a data-clev="10220173" data-site="2" data-title="女子乘车因胖多占座 被邻座辱骂:你个死胖子" data-vid="224490510" data-video-clicker="video3" href="javascript:void(0)" target="_blank" title="女子乘车因胖多占座 被邻座辱骂:你个死胖子"><i class="icon icon-video"></i>女子乘车因胖多占座 被邻座辱骂:你个死胖子</a>, <a data-clev="10220174" data-site="2" data-title="长春冰冻雨雪天气:汽车被冰封 开门拿铁锤敲" data-vid="224483349" data-video-clicker="video3" href="javascript:void(0)" target="_blank" title="长春冰冻雨雪天气:汽车被冰封 开门拿铁锤敲"><i class="icon icon-video"></i>长春冰冻雨雪天气:汽车被冰封 开门拿铁锤敲</a>, <a data-clev="10220175" data-site="2" data-title="青岛沿海公路遭海浪侵袭 海水涌上漫过路面" data-vid="224518573" data-video-clicker="video3" href="javascript:void(0)" target="_blank" title="青岛沿海公路遭海浪侵袭 海水涌上漫过路面"><i class="icon icon-video"></i>青岛沿海公路遭海浪侵袭 海水涌上漫过路面</a>, <a data-param="_f=index_chan08cpc_0" href="https://www.sohu.com/a/433504150_362042?code=cdcf021b63c28fe6ddc5ee179b591c4d" target="_blank" title="勠力战疫共创未来 *倡议G20在这四方面发力">
<b>勠力战疫共创未来 *倡议G20在这四方面发力</b>
</a>, <a data-param="_f=index_chan08cpc_1_0" href="https://www.sohu.com/a/433541143_429139?code=f55e7a26562d0b2ff47c6364267294d1" target="_blank" title="总书记阐述亚太合作中国方案">
<b>总书记阐述亚太合作中国方案</b>
</a>, <a data-param="_f=index_chan08cpc_1_1" href="http://m.news.cctv.com/2020/11/21/ARTI56CRYo1dPzW38COHRn0u201121.shtml?code=9ac3c2d783ff4956cc2f9774980cbb52" target="_blank" title="互联网之光“点亮” 美好未来"><b>互联网之光“点亮” 美好未来</b></a>, <a data-param="_f=index_chan08news_0" href="https://www.sohu.com/a/433559317_115362" target="_blank" title="这个冬季,我国还会爆发疫情吗?张文宏回应">
<b>这个冬季,我国还会爆发疫情吗?张文宏回应</b>
</a>, <a data-param="_f=index_chan08news_1" href="https://www.sohu.com/a/433526374_115362" target="_blank" title="天津人冒严寒抗疫 网友却被“赞上海贬天津”图片带节奏">
天津人冒严寒抗疫 网友却被“赞上海贬天津”图片带节奏
</a>, <a data-param="_f=index_chan08news_2" href="https://www.sohu.com/a/433533027_119038" target="_blank" title="内蒙古满洲里2例本地确诊病例系夫妻 活动轨迹公布">
<i class="icon icon-video"></i>
......
Process finished with exit code 0
我们发现得到很多数据,但是并没有精确到,我们需要的数据。所以这个属性和属性值,还是不行的。
把 title 属性和属性值写入代码如下:
#encoding:utf-8
import requests
from bs4 import BeautifulSoup
requ = requests.get('http://news.sohu.com/')
content = BeautifulSoup(requ.text,'lxml')
info = content.find_all('a',title="天津人冒严寒抗疫 网友却被“赞上海贬天津”图片带节奏")
print(info)
得到结果如下:
D:\pro_py\venv\Scripts\python.exe D:/pro_py/教育学习/7.py
[<a data-param="_f=index_chan08news_1" href="https://www.sohu.com/a/433526374_115362" target="_blank" title="天津人冒严寒抗疫 网友却被“赞上海贬天津”图片带节奏">
天津人冒严寒抗疫 网友却被“赞上海贬天津”图片带节奏
</a>]
Process finished with exit code 0
从结果查看 得到了我们需要的 数据,但是我们需要的是多个这样的数据,并非一个。所以这样的添加 属性是不对的。
看下下方的动图,当鼠标移动到了 \<div class="list16" data-spm="top-news2">:这个时候右侧文字,被阴影覆盖,就表示这一块区域就在 这个 div 标签内。
<标签名 属性名=“属性值”>内容</标签名>
在下图,我们可以看到,标签是 div , 属性是class="list16" data-spm="top-news2" 这两个。
我们把这一块区域的HTML 代码复制下来:
<div class="list16" data-spm="top-news2">
<ul>
<li><a data-param="_f=index_chan08news_0" href="https://www.sohu.com/a/433494879_313745?spm=smpc.news-home.top-news2.1.1606033856144w4nUMI3" target="_blank" title="上海新增1例、内蒙古新增2例 如何看待本土局地疫情的发生?" data-spm-data="1">
<i class="icon icon-video"></i>
<b>上海新增1例、内蒙古新增2例 如何看待本土局地疫情的发生?</b>
</a></li>
<li><a data-param="_f=index_chan08news_1" href="https://www.sohu.com/a/433526374_115362?spm=smpc.news-home.top-news2.2.1606033856144w4nUMI3" target="_blank" title="天津人冒严寒抗疫 网友却被“赞上海贬天津”图片带节奏" data-spm-data="2">
天津人冒严寒抗疫 网友却被“赞上海贬天津”图片带节奏
</a></li>
<li><a data-param="_f=index_chan08news_2" href="https://www.sohu.com/a/433429855_119038?spm=smpc.news-home.top-news2.3.1606033856144w4nUMI3" target="_blank" title="天津新病例追踪:确诊后向朋友道歉 密接者信息泄露被骚扰" data-spm-data="3">
天津新病例追踪:确诊后向朋友道歉 密接者信息泄露被骚扰
</a></li>
<li><a data-param="_f=index_chan08news_3" href="https://www.sohu.com/a/433533027_119038?spm=smpc.news-home.top-news2.4.1606033856144w4nUMI3" target="_blank" title="内蒙古满洲里2例本地确诊病例系夫妻 活动轨迹公布" data-spm-data="4">
内蒙古满洲里2例本地确诊病例系夫妻 活动轨迹公布
</a></li>
<li><a data-param="_f=index_chan08news_4" href="https://www.sohu.com/a/433531007_115362?spm=smpc.news-home.top-news2.5.1606033856144w4nUMI3" target="_blank" title="金融委重磅发声:严厉处罚各种“逃废债”行为" data-spm-data="5">
金融委重磅发声:严厉处罚各种“逃废债”行为
</a></li>
</ul>
</div>
从HTML 分析得到,所有的标题都在这个div 标签中,在DIV标签中 包含了 ul 标签 又包含了 多个 li 标签,li标签里面包含了a ,i b 等标签。
在爬虫的时候我们就要先定位到 这个DIV 标签,缩小范围。然后定位到 li 标签,在li 标签中直接就打印出 新闻标题。
<div class="list16" data-spm="top-news2">
分析 DIV 标签的属性:
属性名 | 解释 |
---|---|
class | 属性可用,但是在Python中要写成这样 :class_ , 多加一个下划线,区分内置的class 命名。【可用】 |
data-spm | Python 不能以 - 横杆命名。【不可用】 |
所以写代码如下 代码如下:
#encoding:utf-8
import requests
from bs4 import BeautifulSoup
requ = requests.get('http://news.sohu.com/')
content = BeautifulSoup(requ.text,'lxml')
info = content.find_all('div',class_="list16")
print(info)
得到结果如下【是一个列表形式打印出来】:
[<div class="list16" data-spm="top-news2">
<ul>
<li><a data-param="_f=index_chan08news_0" href="https://www.sohu.com/a/433559317_115362" target="_blank" title="这个冬季,我国还会爆发疫情吗?张文宏回应">
<b>这个冬季,我国还会爆发疫情吗?张文宏回应</b>
</a></li>
<li><a data-param="_f=index_chan08news_1" href="https://www.sohu.com/a/433526374_115362" target="_blank" title="天津人冒严寒抗疫 网友却被“赞上海贬天津”图片带节奏">
天津人冒严寒抗疫 网友却被“赞上海贬天津”图片带节奏
</a></li>
<li><a data-param="_f=index_chan08news_2" href="https://www.sohu.com/a/433533027_119038" target="_blank" title="内蒙古满洲里2例本地确诊病例系夫妻 活动轨迹公布">
<i class="icon icon-video"></i>
内蒙古满洲里2例本地确诊病例系夫妻 活动轨迹公布
</a></li>
<li><a data-param="_f=index_chan08news_3" href="https://www.sohu.com/a/433531007_115362" target="_blank" title="金融委重磅发声:严厉处罚各种“逃废债”行为">
金融委重磅发声:严厉处罚各种“逃废债”行为
</a></li>
<li><a data-param="_f=index_chan08news_4" href="https://www.sohu.com/a/433557142_260616" target="_blank" title="黄龙景区通报“游客翻栏踩踏五彩池”:立即劝离钙化保护地带">
黄龙景区通报“游客翻栏踩踏五彩池”:立即劝离钙化保护地带
</a></li>
</ul>
</div>, <div class="list16" data-spm="top-news3">
<ul>
<li><a data-param="_f=index_chan08news_5" href="https://www.sohu.com/a/433445870_120388781" target="_blank" title="河北*管理局回应罪犯狱中网恋诈骗:调查组进驻唐山*">
<b>河北*管理局回应罪犯狱中网恋诈骗:调查组进驻唐山*</b>
</a></li>
<li><a data-param="_f=index_chan08news_6" href="https://www.sohu.com/a/433511153_114988" target="_blank" title="利用癌症晚期病人,毒贩从医院开出4000多片管制药品">
利用癌症晚期病人,毒贩从医院开出4000多片管制药品
</a></li>
......
<li><a data-param="_f=index_chan08chuangyenews_5" href="http://www.sohu.com/a/433526516_115362" target="_blank" title="启明创投主管合伙人梁颕宇:医疗健康领域发展机会展望">
启明创投主管合伙人梁颕宇:医疗健康领域发展机会展望
</a></li>
Process finished with exit code 0
在结果中,我们看到了很多新闻标题了,也就是说这就是我们要的数据了。
然后在用 for 循环把这些数据一个一个打印出来,然后在用 find_all 进行查询 li 标签,进行再一次缩小范围。
代码如下:
#encoding:utf-8
import requests
from bs4 import BeautifulSoup
requ = requests.get('http://news.sohu.com/')
content = BeautifulSoup(requ.text,'lxml')
info = content.find_all('div',class_="list16")
for i in info:
c = i.find_all('li')
print(c)
得到结果如下【只复制了部分结果】:
[<li><a data-param="_f=index_chan08news_0" href="https://www.sohu.com/a/433559317_115362" target="_blank" title="这个冬季,我国还会爆发疫情吗?张文宏回应">
<b>这个冬季,我国还会爆发疫情吗?张文宏回应</b>
</a></li>, <li><a data-param="_f=index_chan08news_1" href="https://www.sohu.com/a/433526374_115362" target="_blank" title="天津人冒严寒抗疫 网友却被“赞上海贬天津”图片带节奏">
天津人冒严寒抗疫 网友却被“赞上海贬天津”图片带节奏
</a></li>, <li><a data-param="_f=index_chan08news_2" href="https://www.sohu.com/a/433533027_119038" target="_blank" title="内蒙古满洲里2例本地确诊病例系夫妻 活动轨迹公布">
<i class="icon icon-video"></i>
内蒙古满洲里2例本地确诊病例系夫妻 活动轨迹公布
</a></li>, <li><a data-param="_f=index_chan08news_3" href="https://www.sohu.com/a/433531007_115362" target="_blank" title="金融委重磅发声:严厉处罚各种“逃废债”行为">
金融委重磅发声:严厉处罚各种“逃废债”行为
</a></li>, <li><a data-param="_f=index_chan08news_4" href="https://www.sohu.com/a/433557142_260616" target="_blank" title="黄龙景区通报“游客翻栏踩踏五彩池”:立即劝离钙化保护地带">
黄龙景区通报“游客翻栏踩踏五彩池”:立即劝离钙化保护地带
</a></li>]
因为得到的是一个 列表个格式的数据,所以我们需要再一次的用 for 把它打印输出出来,然后直接取 其中的 字符串【标题】。
代码如下:
#encoding:utf-8
import requests
from bs4 import BeautifulSoup
requ = requests.get('http://news.sohu.com/')
content = BeautifulSoup(requ.text,'lxml')
info = content.find_all('div',class_="list16") # 赛选 class=list6 的 div 标签
for i in info: #循环遍历 div 标签赛选出来的所有值
c = i.find_all('li') #在 div 标签下查找所有 li 标签
for x in c : # 循环遍历出li标签所有的值
newtitle = x.text # 打印出 li 标签下的 内容。
print(newtitle)
如果我们想得到 HTML 标签中的内容,我们直接在后面加 .text 或者 .string 就行。
得到结果如下:
D:\pro_py\venv\Scripts\python.exe D:/pro_py/教育学习/7.py
这个冬季,我国还会爆发疫情吗?张文宏回应
天津人冒严寒抗疫 网友却被“赞上海贬天津”图片带节奏
内蒙古满洲里2例本地确诊病例系夫妻 活动轨迹公布
金融委重磅发声:严厉处罚各种“逃废债”行为
黄龙景区通报“游客翻栏踩踏五彩池”:立即劝离钙化保护地带
河北*管理局回应罪犯狱中网恋诈骗:调查组进驻唐山*
利用癌症晚期病人,毒贩从医院开出4000多片管制药品
辽宁一村民家自来水可点燃?村*:已有专家到现场检测
于欢案律师:回家后他睡一两小时就醒 以为还在狱中
国企董事长骗取国家工程款1.6亿 房产遍及北京、海南、天津
又被共和党人敦促“接受选举结果” 特朗普:抱歉 我不能
印媒:列城实控线附近发现中国坦克运输车 解放军并未放松警惕
......
Process finished with exit code 0
此致。我们就得到了我们需要的数据了,举一反三,如果爬去其他的内容,也是一样的方法,仔细多读文章。今天的教程就到之类啦。
这里是 HTML 静态的网站 爬去的方法,如果是JS动态的,那么他的数据,并不保存在 这个请求的链接下。
本期作业:
爬去 百度新闻的 标题:https://news.baidu.com/