python爬虫的基础知识

1.学习爬虫的好处

提升编程技能:爬虫开发需要掌握编程基础,特别是网络请求、HTML/CSS/JavaScript解析、数据存储和异常处理等技能。通过学习爬虫,你可以巩固和提升你的编程技能,特别是Python等编程语言的应用能力。

数据驱动决策:在当今数据为王的时代,数据是做出明智决策的重要依据。通过爬虫,你可以获取到各种公开的数据资源,如市场分析、用户行为、行业趋势等,从而为你的个人决策或商业决策提供有力支持。

自动化处理任务:爬虫可以实现自动化处理任务,如数据抓取、信息监控、报表生成等。这些任务如果手动完成,不仅费时费力,而且容易出错。通过学习爬虫,你可以将这些繁琐的任务自动化,提高工作效率和准确性。

增强解决问题能力:爬虫开发过程中会遇到各种挑战,如反爬虫机制、动态加载内容、验证码识别等。解决这些问题需要综合运用多种技术和方法,如分析网络请求、模拟用户行为、使用代理IP等。这些过程将锻炼你的问题解决能力和创新思维。

拓宽职业道路:爬虫技能在多个职业领域都有广泛的应用,如数据分析师、数据科学家、产品经理、市场分析师等。掌握爬虫技能将使你更具竞争力,拓宽你的职业道路和发展空间。

应对数据孤岛问题:在许多组织和企业中,数据往往分散在不同的系统和平台中,形成数据孤岛。通过学习爬虫,你可以实现不同系统之间的数据抓取和整合,打破数据孤岛,促进数据的共享和利用。

了解互联网运作机制:爬虫的工作原理涉及到网络协议、HTTP请求、服务器响应等多个方面。通过学习爬虫,你可以更深入地了解互联网的运作机制,理解网页是如何被加载和渲染的,以及数据是如何在网络中传输的。

 

2. HTTP协议的基本概念

全称:Hypertext Transfer Protocol(超文本传输协议)。

作用:用于从WWW服务器传输超文本到本地浏览器的传送协议,保证计算机正确快速地传输超文本文档,并确定传输文档中的哪一部分以及如何显示(如文本先于图形)。

层次:HTTP协议是应用层协议,运行于TCP/IP协议之上,通过TCP或TLS(加密的TCP连接)发送。

模型:采用客户端-服务器架构模式,客户端向服务器发送请求,服务器返回相应的响应。

2.1 HTTP协议的特点

无状态:HTTP协议对事务的处理没有记忆能力,每次请求都需要提供完整的请求信息。

无连接:HTTP协议不需要在客户端和服务器之间建立持久的连接,每个请求都是独立的,服务器处理请求后立即关闭连接(但HTTP 1.1版本支持长连接)。

面向对象:HTTP协议可以传输任何类型的数据对象,如HTML、XML、JSON、图片、音频、视频等。

无阻塞:HTTP协议不会限制客户端的请求数量和大小,使得服务器可以处理大量的请求。

可缓存:HTTP协议允许客户端缓存服务器响应的内容,以提高响应速度和减少网络流量。

2.2 HTTP协议的请求与响应

(1)请求报文

格式:请求报文由请求行、请求头部、空行和请求数据(可选)四部分组成。

请求行:包括请求方法(如GET、POST)、请求URL和HTTP协议版本信息。

请求头部:包含多个字段,用于告知服务器一些额外的信息,如客户端类型、支持的内容格式、是否支持压缩等。

 

f366823ce0c349ad80b5f00054cc25e0.jpeg

(2)响应报文

格式:响应报文由状态行、响应头部、空行和响应数据(可选)四部分组成。

状态行:包括HTTP协议版本、状态码和状态信息,用于描述请求的处理结果。

响应头部:包含多个字段,用于描述响应的各种属性信息,如内容类型、内容编码、长度等。

72e8b4b176f64485922b933ac2cbcc6a.jpeg

 

2.3 HTTP协议的状态码

HTTP协议定义了多种不同的状态码,每个状态码都表示服务器对请求的响应状态。常见的状态码包括:

1xx(信息性状态码):表示请求已经被接收,继续处理。

2xx(成功状态码):表示请求已经被成功接收、理解和处理。

3xx(重定向状态码):表示需要进行额外操作才能完成请求。

4xx(客户端错误状态码):表示客户端发送的请求有误,服务器无法处理。

5xx(服务器错误状态码):表示服务器在处理请求的过程中发生了错误。

 

2.4 URI与URL

HTTP 协议使用 URI 定位互联网上的资源。因为 URI 可以访问到互联网上任意位置的资源。

URI(Uniform Resource Ide ntifier,统一资源标识符),用字符串标识某一互联网资源。

URL(Uniform Resource Locator,统一资源定位符),表示资源的地点(互联网上所处的位置)

URL是URI的一个子集,它特指那些能够定位到互联网上资源的URI。换句话说,所有的URL都是URI,但不是所有的URI都是URL。URL通常指的是能够通过网络协议访问的资源的地址。

URI 的格式:

07ffb1be4c0e42139bdf7b162b8a1382.jpeg

 

3. 爬虫程序常用库

3.1 requests 库

requests 是 Python 中一个常用的 HTTP 请求库,通过它可以方便地发送 HTTP/1.1 请求。

它可以简化 HTTP 请求的过程,支持自动处理重定向、cookies 等功能,同时支持多种认证方式等。

3.2 requests 库基本使用

(1) 安装 requests 库

使用 requests 库,需要先安装。可以通过 pip 命令来安装:

pip install requests

(2) 导入 requests 库

安装完成后,就可以在 Python 中导入使用:

import requests

(3) requests 的常用方法

requests.get(url, params=None, **kwargs)

说明:

  • 发送 GET 请求

  • url 为请求的 URL

  • params 为请求参数(字典或者字符串)

  • **kwargs 其它参数,如 headers、timeout 等

requests.post(url, data=None, json=None, **kwargs)

说明:

  • 发送 POST 请求

  • url 为请求的 URL

  • data 为 POST 请求的数据(字典或者字符串)

  • json 为 POST 请求的 JSON 数据,

  • **kwargs 其它参数,如 headers、timeout 等

requests.put(url, data=None, **kwargs)

说明:

  • 发送 PUT 请求,

  • url 为请求的 URL

  • data 为 PUT 请求的数据(字典或者字符串)

  • **kwargs 其它参数,如 headers、timeout 等

requests.delete(url, **kwargs)

说明:

  • 发送 DELETE 请求

  • url 为请求的 URL

  • **kwargs 其它参数,如 headers、timeout 等

其中,**kwargs 为可选参数,支持以下参数:

  • headers: 请求头部

  • cookies: cookies

  • auth: 认证

  • timeout: 超时时间

  • allow_redirects: 是否允许重定向,默认为 True

  • proxies: 代理

  • verify: 是否验证 SSL 证书,默认为 True

  • cert: SSL 证书

   例:

import requests
​
# 发送 GET 请求
response = requests.get('https://www.baidu.com/')
print(response.status_code)  # 响应状态码
print(response.text)  # 响应内容
​
# 发送 POST 请求
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())  # 响应内容(JSON 格式)

说明:

  • 上述代码分别演示了使用 requests 发送 GET 和 POST 请求,获取响应状态码和内容,并将 POST 请求的数据传递给 data 参数。

  • https://httpbin.org/post 是一个 HTTP 请求和响应测试网站,可以用于测试 HTTP 客户端请求的功能。你可以向该网站发送请求,然后它将返回一些关于该请求的信息,包括请求头、响应头、请求方法、请求数据等等。这对于调试和测试 HTTP 请求非常有用。

(4)处理 HTTP 响应内容

处理 HTTP 响应内容通常需要根据实际情况选择合适的方式,可以使用 requests 库提供的 textcontent 属性获取响应内容,也可以使用其他库来处理。

(5) 获取文本内容

使用 requests 库发送 HTTP 请求并获取响应时,可以使用 text 属性来获取响应的文本内容。

例如:

import requests
​
response = requests.get('http://www.example.com')
print(response.text)

说明:

  • 这里将请求的响应赋值给 response 变量;

  • 然后使用 text 属性来获取文本内容。如果响应中的内容是文本,那么这种方式非常方便,可以直接获取到文本内容进行后续处理。

(6) 获取二进制数据

如果响应中包含的是二进制数据(例如:图片、音频、视频等),那么使用 content 属性可以获取这些数据。

例如:

import requests
​
response = requests.get('http://www.example.com/image.jpg')
with open('image.jpg', 'wb') as f:f.write(response.content)

说明:

  • 这里将响应的二进制数据保存到本地文件中,使用了 content 属性获取响应内容。

  • 需要注意的是,如果响应中包含的是二进制数据,那么不能直接使用 text 属性来获取内容,否则可能会出现编码等问题。此时应该使用 content 属性获取响应内容,并根据实际需要进行进一步处理。

(7) 其他处理方式

除了使用 requests 库提供的 textcontent 属性获取响应内容之外,还可以使用其他库来处理 HTTP 响应内容,例如:

  • BeautifulSoup 库:用于解析 HTML 和 XML 文档,可以方便地提取其中的数据。

  • lxml 库:也用于解析 HTML 和 XML 文档,性能比 BeautifulSoup 更好。

  • json 库:用于解析 JSON 格式的数据。

根据实际情况选择合适的方式来处理 HTTP 响应内容,可以提高代码的可读性和可维护性。

3.3 BeautifulSoup 库基本使用

BeautifulSoup 是 Python 的一个 HTML 或 XML 解析库,可以方便地从 HTML 或 XML 文档中提取数据。

它的主要功能包括解析 HTML 或 XML 文档、搜索文档树、遍历文档树、修改文档树等。

使用 BeautifulSoup 库可以大大简化网页数据的解析和提取过程,减少爬虫代码的编写难度。

BeautifulSoup 支持多种解析器,包括 Python 自带的标准库解析器 html.parser、 lxml 解析器和 html5lib 解析器等。可以根据需要选择不同的解析器进行解析。

BeautifulSoup 对象的基本操作主要包括创建 BeautifulSoup 对象、解析 HTML 文档、搜索文档中的元素、修改 HTML 文档等。

(1)安装BeautifulSoup库

pip install BeautifulSoup4

(1) BeautifulSoup 的基本操作

BeautifulSoup(html, 'html.parser'):将 HTML 代码解析为 BeautifulSoup 对象。

需要传入两个参数:被解析的文本和解析器。

常用的解析器有 html.parser、lxml 和 html5lib。

from bs4 import BeautifulSoup
import requests
​
url = 'https://www.example.com/'
response = requests.get(url)
html = response.text
​
soup = BeautifulSoup(html, 'html.parser')

(2) 标签选择器

在 BeautifulSoup 中,标签选择器是最常用的选择器之一,可以通过标签名直接选取指定标签。

  • soup.find('tag'):返回第一个匹配到的标签

  • soup.find_all('tag'):返回所有匹配到的标签

  • soup.select('css_selector'):使用 CSS 选择器获取标签

下面是一个使用标签选择器的示例:

from bs4 import BeautifulSoup
​
html = """
<!DOCTYPE html>
<html>
<head><title>网页标题</title>
</head>
<body><h1>文章标题</h1><p>这是第一段文字</p><p>这是第二段文字</p>
</body>
</html>
"""
​
soup = BeautifulSoup(html, 'html.parser')
​
# 选取标题标签
title_tag = soup.title
print(title_tag)
​
# 选取文章标题标签
h1_tag = soup.h1
print(h1_tag)
​
# 选取第一段文字标签
p_tag1 = soup.p
print(p_tag1)
​
# 选取第二段文字标签
p_tag2 = soup.find_all('p')[1]
print(p_tag2)

输出结果如下:

<title>网页标题</title>
<h1>文章标题</h1>
<p>这是第一段文字</p>
<p>这是第二段文字</p>

说明:

  • soup.p选取的是第一个<p>标签。

  • find_all方法和列表索引的方式选取了第二个<p>标签。

  • find方法返回第一个匹配的标签

  • find_all方法返回所有匹配的标签,返回结果均为一个Tag对象。

在使用标签选择器时,需要注意标签名的大小写。例如,soup.p可以选取<p>标签,但无法选取<P>标签。

同时,如果选取不存在的标签,将会返回None类型。

(3) 标签属性选择器

  • soup.find('tag', attrs={'attribute': 'value'}):返回第一个匹配到的带有指定属性的标签。

  • soup.find_all('tag', attrs={'attribute': 'value'}):返回所有匹配到的带有指定属性的标签。

  • soup.select('tag[attribute=value]'):使用 CSS 选择器获取带有指定属性的标签。

from bs4 import BeautifulSoup
​
html_doc = """
<html>
<head><title>Example</title>
</head>
<body><div id="content"><p class="first">This is the first paragraph.</p><p class="second" custom="123">This is the second paragraph.</p><p class="second">This is the third paragraph.</p></div>
</body>
</html>
"""
​
soup = BeautifulSoup(html_doc, 'html.parser')
​
# 选择所有具有 class="second" 属性的 <p> 标签
second_paragraphs = soup.select('p[class=second]')
for p in second_paragraphs:print(p.text)
​
# 选择具有 custom 属性的 <p> 标签
custom_paragraphs = soup.select('p[custom]')
for p in custom_paragraphs:print(p.text)

(4) 获取标签内容

获取标签内容可以使用BeautifulSoup对象的.text属性或.string属性来获取。这两个属性可以获取标签内的纯文本内容,但有一些区别:

  • tag.text:获取标签的纯文本内容。可以获取当前标签及其子标签内的所有文本内容,并将其拼接成一个字符串返回。使用.text属性获取标签的文本内容非常方便,而且适用于大多数情况。

  • tag.string:获取标签的纯文本内容。只能获取当前标签内的文本内容,当标签内含有多个字符串时,返回值为None

  • tag.get('attribute'):获取标签指定属性的值。

假设有以下HTML文档:

<html>
<head><title>Example</title>
</head>
<body><h1>Hello World</h1><p>This is an example page.</p><ul><li>Item 1</li><li>Item 2</li></ul>
</body>
</html>

使用 BeautifulSoup 解析后,可以获取各个标签的内容:

from bs4 import BeautifulSoup
​
html_doc = """
<html>
<head><title>Example</title>
</head>
<body><h1>Hello World</h1><p>This is an example page.</p><ul><li>Item 1</li><li>Item 2</li></ul>
</body>
</html>
"""
​
soup = BeautifulSoup(html_doc, 'html.parser')
​
# 获取h1标签的文本内容
h1 = soup.find('h1')
print(h1.text) # Hello World
​
# 获取p标签的文本内容
p = soup.find('p')
print(p.text) # This is an example page.
​
# 获取ul标签的文本内容
ul = soup.find('ul')
print(ul.text) # Item 1\nItem 2\n
​
# 获取li标签的文本内容
li = soup.find('li')
print(li.text) # Item 1

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣高频SQL 50题(基础版)第二十四题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十四题1729.求关注者的数量题目说明实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第二十四题 1729.求关注者的数量 题目说明 表&#xff1a; Followers ----------------…

QT--聊天室

一、设计要求 用QT做一个聊天室&#xff0c; 制作一个服务器和客户端。可以进行注册、登录&#xff0c; 登陆成功后可以使用昵称进行发送、接收消息。 能根据昵称、聊天内容查询历史记录&#xff0c;也可以查询全部聊天记录。 。 二、客户端三级ui界面 三、项目代码 //在…

【Redis进阶】集群

1. 集群分片算法 1.1 集群概述 首先对于"集群"这个概念是存在不同理解的&#xff1a; 广义的"集群"&#xff1a;表示由多台主机构成的分布式系统&#xff0c;称为"集群"狭义的"集群"&#xff1a;指的是redis提供的一种集群模式&…

K210视觉识别模块学习笔记8:Mx_yolo3本地模型训练环境搭建_部署模型到亚博canmv(失败)

今日开始学习K210视觉识别模块: 本地模型训练环境搭建 亚博智能 K210视觉识别模块...... 固件库: canmv_yahboom_v2.1.1.bin 本地训练 Mx_yolo3 这里就简单地提示一下下载安装哪些软件&#xff0c;然后主要是使用Mx_yolo3 进行本地训练模型的...... 本文不…

【Android】Fragment的添加

上一篇文章学到了碎片的创建与生命周期&#xff0c;接下来学习碎片的常用操作&#xff0c;其中会用到上一篇文章的三个碎片&#xff0c;就做一个简单的说明吧&#xff1a;LeftFragment&#xff08;包含一个按钮&#xff09;、RightFragment4&#xff08;以粉色为背景的文本&…

跨境电商选品师做好这几个关键点

在当今充满竞争的跨境电商市场上&#xff0c;成为一名成功的选品师并非易事。以下是几个关键点&#xff0c;能够帮助跨境电商选品师做好工作并取得成功。下面老阳为大家总结几点做好跨境选品师的几个关键点&#xff0c;希望对大家有所帮助。 首先&#xff0c;深入市场调研和产品…

Notepad

https://codeforces.com/contest/17/problem/D ​​​​​​​ 没有前导零 因此一共写个数字&#xff0c;再mod c 数据范围很大,因此我们魔改一下快读 再用扩展欧拉定理 #include<iostream> #include<cstdio> #include<cstring> using namespace std; ty…

JAVA里的多线程上部(详解)

1.实现多线程 1.1简单了解多线程【理解】 是指从软件或者硬件上实现多个线程并发执行的技术。 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程&#xff0c;提升性能。 1.2并发和并行【理解】 并行&#xff1a;在同一时刻&#xff0c;有多个指令在多个CPU上…

华清IOday2 24-7-29

1> 写一个日志文件&#xff0c;将程序启动后&#xff0c;每一秒的时间写入到文件中 1、2024- 7-29 10:31:19 2、2024- 7-29 10:31:20 3、2024- 7-29 10:31:21 ctrlc:停止程序 ./a.out 4、2024- 7-29 10:35:06 5、2024- 7-29 10:35:07 6、2024- 7-29 10:35:08 main.c …

缓存穿透,缓存击穿,缓存雪崩

目录 介绍 缓存穿透 缓存击穿 缓存雪崩 原因 影响 解决方案 缓存穿透 防止缓存穿透->空值缓存案例 缓存击穿 使用互斥锁解决缓存击穿 介绍 缓存穿透 定义&#xff1a;缓存穿透是指用户查询数据&#xff0c;缓存和数据库中都不存在该数据&#xff08;一般是发起恶意…

实战:ZooKeeper 操作命令和集群部署

ZooKeeper 操作命令 ZooKeeper的操作命令主要用于对ZooKeeper服务中的节点进行创建、查看、修改和删除等操作。以下是一些常用的ZooKeeper操作命令及其说明&#xff1a; 一、启动与连接 启动ZooKeeper服务器&#xff1a; ./zkServer.sh start这个命令用于启动ZooKeeper服务器…

403 forbidden (13: Permission denied)

403 forbidden (13: Permission denied) 目录 403 forbidden (13: Permission denied) 【常见模块错误】 【解决方案】 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者…

基于视觉的语义匹配见多了,那基于雷达的呢?

论文题目&#xff1a; LiDAR-based HD Map Localization using Semantic Generalized ICP with Road Marking Detection 论文作者&#xff1a; Yansong Gong, Xinglian Zhang, Jingyi Feng, Xiao He and Dan Zhang 作者单位&#xff1a;北京驭势科技有限公司 导读&#xff…

python 查询机器python、gpu、安装包等环境版本信息

checkenv.py """Check environment configurations and dependency versions."""import importlib import os import resource import subprocess import sys from collections import OrderedDict, defaultdictimport torch# 查询自己想要的包…

cf960(div2)

A. Submission Bait&#xff08;博弈&#xff09; 题意&#xff1a;爱丽丝和鲍勃在大小为n的数组a中进行游戏&#xff0c;他们轮流进行运算&#xff0c;爱丽丝先开始&#xff0c;不能运算的一方输&#xff0c;一开始mx0&#xff0c;每次操作&#xff0c;玩家可以选择一个牵引i…

MOMFEA-SADE--基于子空间对齐和自适应差分进化的多目标多任务优化算法

MOMFEA-SADE–基于子空间对齐和自适应差分进化的多目标多任务优化算法 title&#xff1a; Evolutionary Multitasking for Multiobjective Optimization With Subspace Alignment and Adaptive Differential Evolution author&#xff1a; Zhengping Liang, Hao Dong, Cheng …

【Git】 如何将一个分支的某个提交合并到另一个分支

【Git】 如何将一个分支的某个提交合并到另一个分支 在使用 Git 进行版本控制时&#xff0c;常常会遇到这样的需求&#xff1a;将某个分支的特定提交合并到另一个分支中。这种情况下&#xff0c;我们可以使用 cherry-pick 命令来实现。本文将详细介绍 cherry-pick 命令的使用方…

“链动革新:2+1模式引领用户复购与留存潮流“

大家好&#xff01;我是吴军&#xff0c;来自一家在业界享有盛誉的软件开发公司&#xff0c;担任产品经理一职。今天&#xff0c;我想和大家深入探讨一个话题——如何利用创新的链动21模式来显著提升用户的留存率和复购率。 提到链动模式&#xff0c;很多人可能第一时间想到的是…

醒醒,别睡了...讲《数据分析pandas库》了—/—<6>

一、 1、长宽格式转换 基于多重索引&#xff0c;Pandas 可以很容易地完成长型、宽型数据格式的相互转换。 1.1 转换为最简格式 stack&#xff08;&#xff09;其使用法如下&#xff1a; stack函数用于将DataFrame中的列转换为行&#xff0c;即将宽格式数据转换为长格式数据。…

中控屏UI设计全解析:布局与交互技巧

在现代科技的浪潮中&#xff0c;中控屏已成为智能系统不可或缺的交互界面。无论是智能家居、车载系统还是工业控制&#xff0c;一个直观、易用且美观的中控屏 UI 设计对于提升用户体验至关重要。本教程将带领你深入探索中控屏UI设计的精髓&#xff0c;指导你如何打造出既专业又…