Python 之网络爬虫

一.认识HTML

1.什么是HTML (HyperText Markup Language)

  • HTML是超文本标记语言的缩写,它包含一系列的标签, “超文本”是一种组织信息的方式,利用HTML标记,告诉浏览器被标记的内容如何显示到浏览器页面上。          

例如:< p>我热爱我的祖国< /p>,被标记的内容是“我热爱我的祖国”,而< p></ p>则是HTML的标记符;当浏览器读取到这个标记时,就可以将这段文本内容显示到浏览器页面上。

  • 使用HTML语言可以建立自己的WEB站点文件,HTML文件运行在浏览器上,由浏览器来解析,并将标记的内容显示出来。

注意:HTML语言为解释型语言,即写出来代码直接就能运行,而例如C语言、JAVA则为编译型语言,需要编译成二进制文件,计算机才能解释执行。

2.HTML文档结构

以下是一个简单的HTML代码段,浏览器执行效果如图所示:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>菜鸟教程(runoob.com)</title>
    </head>
    <body>
         <h1>我的第一个标题</h1>
         <h2>这是一个标题</h2>
         <h3>这是一个标题</h3>
         <p>我的第一个段落。</p>
         <p>这是第二个段落。</p>
        <p>这是第三个段落。</p>
     </body>                                
</html>

一个具体的HTML文档标签解析为一颗树(DOM树):

HTML常用标签、元素及标签属性

 HTML 是所有网页制作技术的核心和基础,也是每个网页制作者必须掌握的基本知识,而 html 标签是 html 语言中最基本的单位,是 HTML最重要的组成部分。

HTML常用标签

HTML标签的特点:

①HTML标签是由尖括号包围的关键词,比如 < html >

②HTML标签分别双标签和单标签,标签中有属性,属性具有属性值。

③HTML双标签,比如 < b> 和 < /b>为双标签,标签对中的第一个标签是开始标签,第二个标签是结束标签,开始和结束标签也被称为开放标签和闭合标签。

④HTML 标签是与大小写无关的,例如“< BODY>”跟< body>表示的意思是一样的,推荐使用小写。

HTML元素

一个 HTML 元素包含了开始标签与结束标签,如下为一个HTML元素:    

<p>这是一个段落。</p>

有时也把元素称为节点。HTML 元素以开始标签起始,以结束标签终止,元素的内容是开始标签与结束标签之间的内容。某些 HTML 元素具有空内容(empty content),空元素在开始标签中进行关闭(以开始标签的结束而结束)。大多数 HTML元素可拥有属性,可以嵌套。

HTML标签属性

属性是用来修饰标签的,放在开始标签里面,提供了有关 HTML 元素的更多的信息。比如在a标签,属性可以定义跳转的超链接,或者类名称

<a href="http://www.w3school.com.cn">This is a link</a>

属性类似于描述人的形容词,比如,戴眼镜,帅气,体重200斤等。 HTML把属性分为四类:

 Xpath

1.什么是XPath

XPath即为DOM解析树路径语言(XML Path Language),它是一种用来确定HTML文档中某部分位置的语言。

XPath 使用路径表达式来选取HTML文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。路径表达式是从一个HTML节点(当前的上下文节点)到另一个节点、或一组节点的步骤顺序。这些步骤以“/”字符分开,每一步有三个构成成分:

(1)轴描述(用最直接的方式接近目标节点);

(2)节点测试(用于筛选节点位置和名称);

(3)节点描述(用于筛选节点的属性和子节点特征)。

假设有一个网页的解析树如图:

那么获取小区名的Xpath就是: 

 /html/body/div[4]/div[1]/ul/li[1]/div[1]/div[1]

从这个例子可知,XPath就是html代码解析树的一个个节点,其中数字是节点出现的序号。   用标签结合属性Xpath可以达到同样的效果,如:

   div[@class ="title"]

  可以获取网页中属性class为title的所有节点,但有些非小区名称的数据也可能会被提取出来。

  Xpath路径表达式语法

使用路径表达式 

 

带有谓语的一些路径表达式,以及表达式的结果如表所示: 

通过使用”|”,可以选取若干路径 

二.爬 虫 原 理

1.网络连接

网络连接像是在自助饮料售货机上购买饮料一样:购买者只需选择所需饮料,投入硬币(或纸币),自助饮料售货机就会弹出相应的商品。网络连接也正是如此,如图所示,本机电脑(购买者)带着请求头和消息体(硬币和所需饮料)向服务器(自助饮料售货机)发起一次Requests请求(购买),相应的服务器(自助饮料售货机)会返回本机电脑相应的HTML文件作为Response(相应的商品)。

 

2.爬虫流程

   网络连接需要一次Requests请求和服务器端的Response回应。所以爬虫需要二件事:

(1)模拟电脑对服务器发起Requests请求。

(2)接收服务器端的Response的内容并解析提取所需信息。     但互联网网页错综复杂,一次的请求和回应不能够批量获取网页的数据,这时就需要设计爬虫的流程,如图所示。

简单地讲就是:网页采集-->网页解析--->数据入库

常用模块 

1、Requests模块

Requests库官方文档指出:让HTTP服务人类。细心的读者就会发现,Requests模块的作用就是请求网站获取网页数据的。

response的属性:

(1)response.status_code:http请求的返回状态,2XX 表示连接成功,3XX 表示跳转 , 4XX 客户端错误 , 500 服务器错误

(2)response.text:http响应内容的 字符串(str) 形式,请求url对应的页面内容。

(3)response.encoding=“utf-8” 或者 response.encoding=”gbk”:打印文本没有乱码。

(4)response.content:HTTP响应内容的 二进制(bytes) 形式。

(5)response.headers:http响应内容的头部内容。

例如:

import requests
res = requests.get('http://bj.xiaozhu.com/') 
print(res)      #如果返回200,说明请求网址成功,若为404,400则请求网址失败。
print(res.text)
写成函数:
def getHtml(url):
    #异常处理
    try:
        res= requests.get(url) #使用get函数打开指定的url
        res.raise_for_status() #如果状态不是200,则引发异常
        res.encoding = 'utf-8'       #更改编码方式
        return r.text           #返回页面内容
    except:
        return "打开网页失败"   #发生异常返回空字符
url='http://bj.xiaozhu.com/'
html=getHtml(url)

2、BeautifulSoup模块 

通过BeautifulSoup模块可以轻松的解析Requests模块请求的网页,并把网页源代码解析为Soup文档,以便过滤提取数据,如:

from bs4 import BeautifulSoup
	soup = BeautifulSoup('<b class="boldest">数据在这里</b>')   
	tag = soup.b     #见表11.6
	print(tag.text)    #返回 “数据在这里”

 BeautifulSoup 对象的常用属性

Tag 对象的常用属性 

注意:按照 HTML 语法,可以在标签中嵌套其他标签,因此,string 属性的返回值遵循如下原则: (1)如果标签内部没有其他标签,string 属性返回其中的内容。

(2)如果标签内部还有其他标签,但只有一个标签,string 属性返回最里面标签的内容。

(3)如果标签内部还有其他标签,且不止一个标签,string 属性返回 None。 

3、lxml模块

lxml是以Python语言编写的库,主要用于解析和提取HTML或者XML格式的数据,它不仅功能非常丰富,而且便于使用,可以利用XPath语法快速地定位特定的元素或节点。

lxml模块中大部分的功能都位于 lxml.etree子模块中。

lxml模块中ElementPath类:可以理解为XPath,用于搜索和定位节点。提供了三个常用的方法,可以满足大部分搜索和查询需求,并且这两个方法的参数都是XPath语句,具体如下:

find()方法:返回匹配到的第一个子元素;

findall()方法:以列表的形式返回所有匹配的子元素。

iterfind()方法:返回一个所有匹配元素的迭代器。 

三.小结

(1)对于定向信息的爬取,网络爬虫主要采取数据抓取、数据解析、数据入库等几个步骤; (2)requests 模块、beautifulsoup4 模块、lxml模块都是第三方库,使用前需先进行安装;

(3)requests 模块中使用 requests.get()函数获取网页信息;

(4)beautifulsoup4 模块用于解析和处理 HTML 和 XML 文件,其最大的优点是,能够根据 HTML 和 XML 语法建立解析树,进而提高解析效率;

(5)BeautifulSoup 对象的 find_all()方法会遍历整个 HTML 文件,按照条件返回标签内容(列表类型) ;

(6)Xpath使用路径表达式来选取HTML文档中的节点或者节点集;

(7)lxml可以利用XPath语法快速地定位特定的元素或节点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/923088.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据分享】2001-2023年我国30米分辨率冬小麦种植分布栅格数据(免费获取)

小麦、玉米、水稻等各类农作物的种植分布数据在农业、环境、国土等很多专业都经常用到&#xff01; 本次给大家分享的是我国2001-2023年逐年的30米分辨率冬小麦种植分布栅格数据&#xff01;数据格式为TIFF格式&#xff0c;数据坐标为GCS_WGS_1984。该数据包括我国11个省份的冬…

C语言菜鸟入门·关键字·union的用法

目录 1. 简介 2. 访问成员 2.1 声明 2.2 赋值 3. 共用体的大小 4. 与typedef联合使用 5. 更多关键字 1. 简介 共用体&#xff08;union&#xff09;是一种数据结构&#xff0c;它允许在同一内存位置存储不同的数据类型&#xff0c;但每次只能存储其中一种类型的…

嵌入式驱动开发详解3(pinctrl和gpio子系统)

文章目录 前言pinctrl子系统pin引脚配置pinctrl驱动详解 gpio子系统gpio属性配置gpio子系统驱动gpio子系统API函数与gpio子系统相关的of函数 pinctrl和gpio子系统的使用设备树配置驱动层部分用户层部分 前言 如果不用pinctrl和gpio子系统的话&#xff0c;我们开发驱动时需要先…

低代码搭建crm系统实现财务管理功能模块

实例背景&#xff1a; CRM的项目&#xff0c;客户想要实现一个简单的财务记账功能&#xff0c;记录订单应收账款及收款记录。 具体要求&#xff1a; 1、要求收款时可以实时计算本次收款后的剩余应收。 2、要求记录AR的收款状态&#xff1a;未收款、部分收款、已收款。 实现…

C51相关实验

C51相关实验 LED //功能&#xff1a;1.让开发板的LED全亮&#xff0c;2,点亮某一个LED,3.让LED3以5Hz的频率闪动#include "reg52.h"#define LED P2 sbit led1 LED^1;void main(void) {LED 0xff;//LED全灭led1 0;while(1)//保持应用程序不退出{} }LED 输出端是高…

【测试工具JMeter篇】JMeter性能测试入门级教程(一)出炉,测试君请各位收藏了!!!

一、前言 Apache JMeter是纯Java的开源软件&#xff0c;最初由Apache软件基金会的Stefano Mazzocchi开发&#xff0c;旨在加载测试功能行为和测量性能。可以使用JMeter进行性能测试&#xff0c;即针对重负载、多用户和并发流量测试Web应用程序。 我们选择JMeter原因 是否测试过…

人工智能(AI)与机器学习(ML)基础知识

目录 1. 人工智能与机器学习的核心概念 什么是人工智能&#xff08;AI&#xff09;&#xff1f; 什么是机器学习&#xff08;ML&#xff09;&#xff1f; 什么是深度学习&#xff08;DL&#xff09;&#xff1f; 2. 机器学习的三大类型 &#xff08;1&#xff09;监督式学…

STM32WB55RG开发(5)----监测STM32WB连接状态

STM32WB55RG开发----5.生成 BLE 程序连接手机APP 概述硬件准备视频教学样品申请源码下载参考程序选择芯片型号配置时钟源配置时钟树RTC时钟配置RF wakeup时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙LED配置设置工程信息工程文件设置参考文档SVCCTL_A…

虚拟机CentOS系统通过Docker部署RSSHub并映射到主机

公告 &#x1f4cc;更新公告 20241124-该文章已同步更新到作者的个人博客&#xff08;链接&#xff1a;虚拟机CentOS系统通过Docker部署RSSHub并映射到主机&#xff09; 一、编辑 YUM 配置文件 1、打开 CentOS 系统中的 YUM 软件仓库配置文件 vim /etc/yum.repos.d/CentOS-Ba…

React(五)——useContecxt/Reducer/useCallback/useRef/React.memo/useMemo

文章目录 项目地址十六、useContecxt十七、useReducer十八、React.memo以及产生的问题18.1组件嵌套的渲染规律18.2 React.memo18.3 引出问题 十九、useCallback和useMemo19.1 useCallback对函数进行缓存19.2 useMemo19.2.1 基本的使用19.2.2 缓存属性数据 19.2.3 对于更新的理解…

【漏洞复现】|百易云资产管理运营系统/mobilefront/c/2.php前台文件上传

漏洞描述 湖南众合百易信息技术有限公司&#xff08;简称&#xff1a;百易云&#xff09;成立于2017年是一家专注于不动产领域数字化研发及服务的国家高新技术企业&#xff0c;公司拥有不动产领域的数字化全面解决方案、覆盖住宅、写字楼、商业中心、专业市场、产业园区、公建、…

远程控制软件:探究云计算和人工智能的融合

在数字化时代&#xff0c;远程控制工具已成为我们工作与生活的重要部分。用户能够通过网络远程操作和管理另一台计算机&#xff0c;极大地提升了工作效率和便捷性。随着人工智能&#xff08;AI&#xff09;和云计算技术的飞速发展&#xff0c;远程控制工具也迎来了新的发展机遇…

漫谈 module caching——PyCharm jupyter notebook 在导入模块被更新后无法及时同步问题

目录 引子&#xff1a;问题的发现何为 module caching见微知著&#xff1a;Python 中的缓存机制参考链接 引子&#xff1a;问题的发现 近日笔者用 PyCharm 创建了一个项目时不经意间发现了这个问题&#xff1a;事情发生在调试 Jupyter Notebook 的过程中。当笔者修改了自己编写…

企业数字化转型现状

国家数字经济战略背景 2018年以来&#xff0c;国家政府不断出台政策规范我国企业数字化治理市场。2018年9月颁布《关于发展数字经济稳定并扩大就业的指导意见》&#xff0c;支持建设一批数字经济创新创业孵化机构。积极推进供应链创新与应用&#xff0c;支持构建以企业为主导。…

《Python基础》之算数、比较、赋值、逻辑、位运算符

目录 简介 Python中常见的运算符 1、算数运算符 2、比较运算符 3、赋值运算符 4、逻辑运算符 5、位运算符 总结 简介 Python 提供了多种运算符&#xff0c;用于执行各种操作&#xff0c;包括算术运算、比较运算、逻辑运算、位运算、赋值运算等。以下是 Python 中常用的…

学习threejs,使用设置bumpMap凹凸贴图创建褶皱,实现贴图厚度效果

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshPhongMaterial高…

【CSP CCF记录】201809-2第14次认证 买菜

题目 样例输入 4 1 3 5 6 9 13 14 15 2 4 5 7 10 11 13 14 样例输出 3 思路 易错点&#xff1a;仅考虑所给样例&#xff0c;会误以为H和W两人的装车时间是一一对应的&#xff0c;那么提交结果的运行错误就会让你瞬间清醒。 本题关键是认识到H和W的装车时间不一定一一对应&…

道品智能科技移动式水肥一体机:农业灌溉施肥的革新之选

在现代农业的发展进程中&#xff0c;科技的力量正日益凸显。其中&#xff0c;移动式水肥一体机以其独特的可移动性、智能化以及实现水肥一体化的卓越性能&#xff0c;成为了农业领域的一颗璀璨新星。它不仅改变了传统的农业灌溉施肥方式&#xff0c;更为农业生产带来了高效、精…

【PCB设计】AD16教程:分配位号

1、前提条件 确保已经基本画完原理图 2、点击【Tools-Annotate Schematics】 3、依次点击【Reset All】、【Update Changes Lise】、【Close】 最后位号就被自动分配好了

20241125编译友善之臂的NanoPi R3S开发板【RK3566】STEP-BY-STEP版本

20241125编译友善之臂的NanoPi R3S开发板【RK3566】STEP-BY-STEP版本 2024/11/25 15:59 20241125编译友善之臂的NanoPi R3S开发板【RK3566】精简步骤 2024/11/25 19:37 viewproviewpro-ThinkBook-16-G5-IRH:~$ viewproviewpro-ThinkBook-16-G5-IRH:~$ df -h viewproviewpro-T…