计算机项目部第四次培训——网页与爬虫初探

Written by

in

文章目录
    • 网页初探
      • HTML简介
      • HTML标签
        • head标签
        • h1标签
        • p标签
        • a标签
        • button标签
        • img标签
        • input标签
        • table标签
        • ul标签
        • ol标签
        • form标签
      • HTML属性
      • HTML块
      • HTML布局
      • HTML布局
        • 传统网页布局方式
        • 布局本质
        • css盒子模型
          • 边框(border)
          • 内边距(padding)
          • 外边距(margin)
        • 浮动(float)
          • 清除浮动
        • 定位
          • 绝对定位
          • 固定定位
    • 爬虫基础培训
      • 1、Requests库
        • 1.1 Robots协议
        • 1.2 requests.request()
        • 1.3 Requests库的常见异常
        • 1.4 requests.get()
        • 1.5 其它方法
      • 2、Beautiful Soup库
        • 2.1 解析HTML信息
        • 2.2 find_all和find方法
      • 3、Re库
        • 3.1 正则表达式
        • 3.2 Re库
      • 简单的实战(Requests库)

    • HTML是用来描述网页的一种语言
    • HTML是一种超文本标记语言
    • HTML不是一种编程语言,而是一种标记语言
    • HTML使用标签来描述网页
    • HTML文档包含了标签及文本

    标签是成对存在的,有开始标签和结束标签之分。这些标签能够被浏览器解析,浏览器将解析后的内容展示给用户

    head标签用来定义文档的头部,它是所以头部元素的容器。在该标签中,我们可以引用脚本、样式文件、提供元信息。

    该标签常用来定义标题,h1表示最大号,h6表示最小号。该标签为块级标签

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>网页入门</title>
    </head>
    <body><h1>我是h1定义的标签</h1><h2>我是h2定义的标签</h2>
    </body>
    </html>
    

    效果
    在这里插入图片描述

    该标签常用来定义文本段落。该标签为块级标签

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>网页入门</title>
    </head>
    <body><p>我是p标签,我常来定义一段文本内容</p>
    </body>
    </html>
    

    效果
    在这里插入图片描述

    a标签用来定义超链接,用于从一个页面跳转到另一个页面。标签中的href属性为要跳转的页面链接。

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>网页入门</title>
    </head>
    <body><a href="https://www.baidu.com/">点击我,我是百度链接</a>
    </body>
    </html>
    

    效果
    在这里插入图片描述

    button标签用来定义一个按钮

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>网页入门</title>
    </head>
    <body><button>按钮</button>
    </body>
    </html>
    

    效果
    在这里插入图片描述

    该标签用来向网页中嵌入一幅图像

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>网页入门</title>
    </head>
    <body><img src="./photo.jpg" alt="">
    </body>
    </html>
    

    效果
    在这里插入图片描述

    用户可以在该标签中输入信息,可以用来接收用户信息。

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>网页入门</title>
    </head>
    <body><input type="text">
    </body>
    </html>
    

    效果
    在这里插入图片描述

    table用来定义表格,每个表格中的行用tr标签定义,每行中的单元格用td来定义(其中表头用th定义)。

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>网页入门</title>
    </head>
    <body><table><tr><th>第一列</th><th>第二列</th></tr><tr><td>(1,1)</td><td>(1,2)</td></tr><tr><td>(2,1)</td><td>(2,2)</td></tr></table>
    </body>
    </html>
    

    效果
    在这里插入图片描述

    ul标签用来定义无序列表,列表中的小项用li标签定义

    
    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>网页入门</title>
    </head>
    <body><ul><li>one</li><li>two</li><li>three</li></ul>
    </body>
    </html>

    效果

    在这里插入图片描述

    ol标签用来定义有序列表,其中的小项也是用li标签定义

    
    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>网页入门</title>
    </head>
    <body>
    <ol><li>one</li><li>two</li><li>three</li>
    </ol>
    </body>
    </html>
    

    效果
    在这里插入图片描述

    form表单元素用于收集用户输入,表单中的input标签时最重要的元素

    <!DOCTYPE html>
    <html lang="en" xmlns="http://www.w3.org/1999/html">
    <head><meta charset="UTF-8"><title>网页入门</title>
    </head>
    <body><form action="#">用户名:<input type="text"></br>密  码:<input type="text"></br><input type="button" value="提交"></form>
    </body>
    </html>
    

    效果
    在这里插入图片描述

    HTML元素可以设置属性值,属性可以在元素中添加附加信息,属性是以 属性名=“属性值” 形式定义。HTML元素本身带有很多的属性,开发者自己最常添加的属性为id,class

    属性 描述
    class 为HTML元素定义类名,多个类名用空格分隔,方便对多个元素进行操作
    id 定义元素的id,在同一个HTML文件中,id是唯一的,不能够重复
    style 规定元素的行内信息
    title 描述元素的额外信息
    <!DOCTYPE html>
    <html lang="en" xmlns="http://www.w3.org/1999/html">
    <head><meta charset="UTF-8"><title>网页入门</title>
    </head>
    <body><!--给form标签添加action、method、name,id、class属性--><form action="#" method="post" name="" id="" class="">用户名:<input type="text"></br>密  码:<input type="text"></br><input type="button" value="提交"></form>
    </body>
    </html>
    

    在这里插入图片描述

    绝大多数HTML元素被定义为块级元素和内联元素

    • 块级元素:独占一行,可设置width,height,margin,padding属性,对应的display=block

      • h,p,ul,li,table等标签
    • 内联元素:相邻的元素紧挨着排列,设置width,height无效,边距只有margin-left,margin-right,padding-left,padding-right有效

      • td,a,img等标签
    • div元素

    网页中布局最常见的标签。可用于组合其他HTML元素,将网页进行分区。一个div和其中包含的元素为一个区。div为块级元素。与css一起使用,用于对一块区域的内容设置样式

    • span元素

    用做为本的容器,行内元素,与css使用,可以为其包含的文本设置属性。

    简单的讲,就是如何将网页进行划分,将整个网页划分成不同块,每块是相互独立的。通过HTML布局,方便开发人员进行css样式处理,和网页后期的修改甚至局部替换。
    在这里插入图片描述

    • 标准流
    • 浮动
    • 定位

    • 造盒子
    • 放盒子
    • 填盒子

    所有HTML元素可以看作是盒子,在CSS中,“box model”这一术语用来设计和布局时使用。css盒子模型本质上是一个盒子,它包括:外边距(margin)、边框(border)、内边距(padding)、实际内容(content)。

    在这里插入图片描述
    **注意:**当我们通过css指定一个元素的高度和宽度时,只是设置内容区域的高度和宽度。这个元素真正的宽高还包括边距和边框。
    总元素的宽度=宽度+左填充+右填充+左边框+右边框+左边距+右边距
    总元素的高度=高度+顶部填充+底部填充+上边框+下边框+上边距+下边距

    border可以设置元素的边框,边框有三部分组成:边框宽度(粗细)、边框样式、边框颜色

    border:border-width || border-style || border-color
    

    padding属性用于设置内边距,即边框与内容之间的距离

    padding:padding-top padding-right padding-bottom padding-left
    

    margin属性用于设置外边距,即盒子与盒子之间的距离

    margin:margin-top margin-right margin-bottom margin-left
    

    float属性用于创建浮动框。浮动的框可以向左或右移动,直到它的外边缘碰到包含框或者另一个浮动框的边框为止。由于浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样。

    语法:

    float:none || left || right
    
    • 浮动元素的特性:

      • 脱离标准普通流的控制移动到指定位置
      • 浮动的盒子不在保留原来的位置
      • 浮动元素具有行内块元素的特性。任何元素都可以浮动,添加浮动后都具有行内块元素的特性
        • 如果浮动后的盒子高宽没有设置,它的大小根据内容来决定。
        • 浮动的元素中间是没有间隙的,紧挨着排布。
    • 浮动元素通常和标准流一起使用。

    由于浮动只有左右两种形式,在实际布局中难以约束其位置,所以一般的方法是:先用标准流的父元排列上下位置,然后在内部采取浮动排序左右。

    • 浮动的盒子只会影响浮动盒子后面的标准流,不会影响前的标准流。

    当子元素很多或者高度不确定的情况下,开发者不方便直接给父元素设置高度。但是浮动的元素脱离了普通标准流,不占原有位置,这会导致父级元素高度为零,从而影响下面标准流的盒子排布。

    方法

    • 额外标签法
    • 父元素加overflow法
    • after伪元素法
    • 双伪元素法
    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>Title</title><style>.left{height: 50px;width: 50px;float: left;background-color: red;margin: 2px 2px;}#father{border: 2px solid green;/*overflow方法*//*overflow: hidden;*/}/*额外标签法*//*.clearfix{*//*clear: both;*//*}*//*after伪元素方法*/#father:after{display: block;clear: both;content: "";}</style>
    </head>
    <body><div id="father"><div class="left">浮动1</div><div class="left">浮动2</div><div class="left">浮动3</div><div class="left">浮动4</div><div class="clearfix"></div></div>
    </body>
    </html>
    

    安照定位的方式,将盒子定在某一个位置。 定位 = 定位模式 + 偏移量
    1. 行内元素添加绝对定位或者固定定位,可以直接设置高度和宽度
    2. 块级元素添加绝对定位或者相对定位,如果不给宽度和高度,默认大小是内容的大小

    定位模式 是否脱标 移动位置
    static静态定位 不能使用偏移量
    relative相对定位 相对于自身位置移动
    absolute绝对定位 带有定位的父级
    fixed固定定位 浏览器可视区

    偏移量

    top:10px||bottom:10px||left:10px||right:10px
    

    绝对定位是元素在移动的时候,相对于它祖先元素来说。

    position:absolute
    
    • 如果没有祖先元素或者祖先元素没有定位,则以浏览器为基准

    • 如果祖先元素由定位(相对,绝对,固定),则以最近一级的有定位祖先为基准

    • 绝对定位不占原先的位置,即脱离文档流

    • 子绝父相口诀:

    子元素使用绝对定位,父元素要使用相对定位。

    1. 由于子元素为绝对定位,所以父元素需要定位来限制子元素在父元素内移动。
    2. 父盒子布局时,需要占用原来的位置,如果不占用原来的位置,可能会影响其他元素的分布,所以需要使用占文档流的相对定位。

    固定元素在浏览器可视区的位置。

     position:fixed
    
    • 以浏览器的可视区窗口为参照
    • 与父元素无任何关系
    • 不随滚动条移动
    • 不占有原来位置

    Robots Exclusion Standard 网络爬虫排除标准
    作用:网站告知网络爬虫哪些页面可以抓取,哪些不行
    形式:在网站根目录下的robots.txt文件(网页url后加/robots.txt即可查看)

    requests.request(method,url,**kwargs):构造一个请求,返回一个Response对象。

    参数讲解:
    method:7种请求方式:‘GET’,‘HEAD’,‘POST’,‘PUT’,‘PATCH’,‘DELETE’,‘OPTIONS’
    **kwargs:13个控制访问的参数,均为可选项:
        1、params:字典或字节序列;作为参数增加到url中
        2、data:字典、字节或文件对象;作为Request的内容
        3、headers:字典;HTTP定制头
        4、timeout:数值;设定超时时间,单位为秒
        5、verify:True/False,默认为True;认证SSL证书开关

    Response对象的属性:
    1、status_code:获取状态码;正常为200,404或其他为出错
    2、encoding:从HTTP的header中猜测的响应内容编码格式,若header中不存在charset,则认为编码是ISO-8859-1
    3、apparent_encoding:从内容中分析出的响应内容编码方式(备选编码方式),该方式一般更准确
    4、text:将HTTP响应内容以字符串形式返回,会自动根据响应头部的字符编码进行解码
    5、content:HTTP响应内容的二进制形式

    1、requests.ConnectionError:网络连接异常
    2、requests.HTTPError:HTTP错误异常
    3、requests.URLRequired:URL缺失异常
    4、requests.TooManyRedirects:请求超过了设定的最大重定向次数
    5、requests.ConnectTimeout:连接远程服务器超时
    6、requests.Timeout:请求URL超时

    Response对象检查状态码是否正常的方法:
    r.raise_for_status():若状态码不是200,产生HTTPError异常。

    requests.get(url,params=None,**kwargs):获取HTML网页;返回一个Response对象

    实践部分:
    1、迫害百度1(爬取网页的通用代码框架)
    “http://www.baidu.com”

    2、向京东提交关键字
    “https://search.jd.com/Search”

    3、Amazon商品爬取
    “https://www.amazon.cn/dp/B079BG11X2/ref=sr_1_9?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&keywords=Python&qid=1574924345&sr=8-9”

    4、网络图片的爬取
    “http://www.005.tv/uploads/allimg/161203/2004152519-2.jpg”

    requests.head(url,**kwargs):获取HTML网页头的信息方法
    requests.post(url,data=None,json=None,**kwargs):向HTML网页提交POST请求方法
    requests.put(url,data=None,**kwargs):向HTML网页提交PUT请求的方法
    requests.patch(url,data=None,**kwargs):向HTML网页提交局部修改请求
    requests.delete(url,**kwargs):向HTML页面提交删除请求

    用BeautifulSoup库解析html信息:

    from bs4 import BeautifulSoup
    soup=BeautifulSoup('<p>data</p>','html.parser')  
    

    实践部分:迫害百度2
    “https://www.baidu.com/”

    BeautifulSoup类的基本元素:
    .tag:标签,最基本的信息组织单元
    .name:标签的名字
    .attrs:标签的属性;字典形式
    .string:标签内非属性字符串(只适用tag包含单个子节点)
    .text:标签内非属性字符串(tag包含多个子节点)

    实践部分:“http://python123.io/ws/demo.html”

    .find_all(name,attrs,recursive,string,**kwargs):返回一个列表,存储查找的结果
    参数讲解:
    name:对标签名称的检索字符串
    attrs:对标签属性值的检索字符串,可标注属性检索
    recursive:是否对子孙所有节点搜索,默认为True
    string:对标签内非属性字符串区域的检索字符串

    .find():搜索且只返回一个结果,类型为字符串(参数同find_all方法)

    正则表达式:其语法由字符和操作符构成

    常用操作符:
      1、".“表示任何单个字符
      2、”[]“表示字符集,对单个字符给出取值范围;如[abc]表示a、b、c
      3、”*“前一个字符0次或无限次扩展;abc*表示ab,abc,abcc,…
      4、”\d"表示数字,等价于[0-9]
      5、"\w"表示单词字符,等价于[A-Za-z0-9_]

    实践部分:“https://www.osgeo.cn/app/sb207”

    re库采用raw string类型(指不包含转义符的字符串)表示正则表达式,表示为r’text’。

    常用函数:
    1、re.search:在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
    2、re.match:从一个字符串的开始位置起匹配正则表达式,返回match对象;若开始位置不匹配,返回空match对象
    3、re.findall:搜索字符串,以列表类型返回全部能匹配的字符串

    Re库的match对象:
    常用属性:
      .string:待匹配文本
      .re:匹配使用的正则表达式
    常用方法:
      .group(0):获得匹配后的字符串
      .start():匹配字符串在原始字符串的开始位置
      .end():匹配字符串在原始字符串的结束位置

    实践部分:梨视频爬取
    “https://www.pearvideo.com/video_1625572”

    LOL官网全英雄皮肤图片爬取(仿照《20行Python代码爬取王者荣耀全英雄皮肤》)

    import requests
    import osdef getHerolist():url="https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js"#获取英雄列表的json文件herolist=requests.get(url)#解析序列化为json格式的数据herolist_json=herolist.json()#提取英雄的名字hero_name=list(map(lambda x:x['name'],herolist_json['hero']))#提取英雄的编号hero_number=list(map(lambda x:x['heroId'],herolist_json['hero']))return hero_name,hero_numberdef downloadPic():#获取英雄列表的信息hero_name,hero_number=getHerolist()i=0for j in hero_number:#创建文件夹os.mkdir("D:\\LOL_skin\\"+hero_name[i])#进入创建好的文件夹os.chdir("D:\\LOL_skin\\"+hero_name[i])for k in range(30):#拼接urlif k<10:onehero_link="https://game.gtimg.cn/images/lol/act/img/skin/big"+str(j)+'00'+str(k)+'.jpg'else:onehero_link="https://game.gtimg.cn/images/lol/act/img/skin/big"+str(j)+'0'+str(k)+'.jpg'#请求urlim=requests.get(onehero_link)if im.status_code==200:#写入文件with open(str(k)+'.jpg','wb') as f:f.write(im.content)print(hero_name[i]+"的图片已下载完毕")i+=1downloadPic()
    

    参考链接:https://blog.csdn.net/qq_42453117/article/details/103190981

    评论

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注

    站内搜索