python爬虫基础

python爬虫基础

前言

Python爬虫是一种通过编程自动化地获取互联网上的信息的技术。其原理可以分为以下几个步骤:

  1. 发送HTTP请求: 爬虫首先会通过HTTP或HTTPS协议向目标网站发送请求。这个请求包含了爬虫想要获取的信息,可以是网页的HTML内容、图片、视频等。
  2. 接收响应: 目标网站接收到请求后,会返回一个HTTP响应。这个响应包含了请求的数据,状态码、头部信息等。爬虫需要解析这个响应来获取所需的信息。
  3. 解析HTML: 如果爬虫的目标是获取网页上的数据,它需要解析HTML文档。HTML是一种标记语言,包含了网页的结构和内容。爬虫可以使用解析库(如BeautifulSoup、lxml)来从HTML中提取所需的数据。
  4. 提取数据: 爬虫通过解析HTML文档,可以从中提取出所需的数据,例如链接、文本、图片地址等。提取数据的方式通常是使用选择器(Selector),它是一种用于定位HTML元素的表达式。
  5. 存储数据: 爬虫获取到的数据可以被存储到本地文件或数据库中,以备后续使用。常见的数据存储格式包括文本文件、JSON、CSV等。
  6. 处理动态页面: 一些网站使用JavaScript来动态加载内容,这就需要爬虫能够执行JavaScript代码,或者使用带有JavaScript渲染功能的工具(如Selenium、Puppeteer)来获取完整的页面内容。

1、python相关库(BeautifulSoup)

今天主要介绍一下BeautifulSoup模块

BeautifulSoup是一个用于从HTML或XML文档中提取数据的Python库。它的主要作用是解析复杂的HTML或XML文档,并提供了一种简单的方式来浏览文档树、搜索特定的标签、提取数据等。BeautifulSoup的设计目标是让数据提取变得容易、直观,并且具有Pythonic的风格。

2、BeautifulSoup模块的安装

安装命令

pip install bs4

在这里插入图片描述

我这里是安装过了,第一次安装会出现suessful

在这里插入图片描述

3、BeautifulSoup的使用

3.1 简单的使用(以百度为例)

# coding=utf-8
import requests  # 导入请求模块
from bs4 import BeautifulSoup  # 
# from bs4 import BeautifulSoup 这样导入的目的是从 bs4(Beautiful Soup 4)库中引入 BeautifulSoup 类。这样导入的好处是在代码中使用 BeautifulSoup 类时不需要每次都写出完整的模块路径,简化了代码,提高了可读性。# 设置要爬取的网站
url = "https://www.baidu.com/"
heder = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}# 爬取内容
res = requests.get(url, headers=heder)  # 这里是去请求网页的内容
# 获取内容
content = res.text  # 这里是让爬取的内容以文本的形式打开,同时保存到变量# 初始化Beatifulsoup
soup = BeautifulSoup(content, 'html.parser')
# 获取标题标签
print(soup.title)
# 如果想要直接获取标题的内容
# print(soup.title.string)

注意:因为百度需要添加请求头才能获取返回的内容,故此处定义了一个heder

请求头可以按以下方式获取

在这里插入图片描述

运行结果

在这里插入图片描述

3.2 soup.tagName的使用

在BeautifulSoup中,soup.tagName 的语法用于访问解析后的HTML文档中特定HTML标签的第一个出现实例。在这里,soup 是BeautifulSoup对象的引用,而tagName是你想要访问的HTML标签的名称。

它会返回第一个你指定的html标签的内容

这里可以看到百度的第一个a标签是百度首页的

在这里插入图片描述

使用soup.tagName

# coding=utf-8
import requests
from bs4 import BeautifulSoup# 设置要爬取的网站
url = "https://www.baidu.com/"
heder = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}# 爬取内容
res = requests.get(url, headers=heder)
# 获取内容
content = res.text  # 这里是让爬取的内容以文本的形式打开,同时保存到变量# 初始化Beatifulsoup
soup = BeautifulSoup(content, 'html.parser')
# 获取<a></a>标签第一次出现的地方
# print(soup.tagName)
print(soup.a)

运行结果

在这里插入图片描述

3.3 soup.find

soup.find() 是 BeautifulSoup 中用于查找单个标签的方法。它用于按照指定的条件查找文档中的第一个匹配的标签,并返回这个标签的 BeautifulSoup 对象。

查找标签的功能与soup.tagName是一样的,不同的是soup.find拥有丰富的参数,所以可以通过标签的class属性,或者是id属性来查找特定的标签

相关参数

  • name: 要查找的标签名称,可以是字符串、正则表达式、函数等。
  • attrs: 标签的属性,可以用字典形式表示。
  • recursive: 是否递归查找,默认为 True。
  • string: 标签中的文本内容。
  • kwargs: 其他特定标签属性的关键字参数。

下面演示通过attrs查找

在这里插入图片描述

# coding=utf-8
import requests
from bs4 import BeautifulSoup# 设置要爬取的网站
url = "https://www.baidu.com/"
heder = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}# 爬取内容
res = requests.get(url, headers=heder)
# 获取内容
content = res.text  # 这里是让爬取的内容以文本的形式打开,同时保存到变量# 初始化Beatifulsoup
soup = BeautifulSoup(content, 'html.parser')
# 获取<a></a>标签第一次出现的地方
print(soup.find('input', attrs={'id': 'su'}))

运行结果

在这里插入图片描述

3.4 soup.find_all

该方法返回的是指定标签下面的所有内容,而且是列表的形式;传入的方式是多种多样的。

(1)传入单个标签

# coding=utf-8
import requests
from bs4 import BeautifulSoup# 设置要爬取的网站
url = "https://www.baidu.com/"
heder = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}# 爬取内容
res = requests.get(url, headers=heder)
# 获取内容
content = res.text  # 这里是让爬取的内容以文本的形式打开,同时保存到变量# 初始化Beatifulsoup
soup = BeautifulSoup(content, 'html.parser')
# 获取所有的a标签并以列表形式返回
list_a = soup.find_all('a')
# 输出显示获取到的a标签列表
for i in list_a:print(i)

运行结果

在这里插入图片描述

(2)传入多个标签

# coding=utf-8
import requests
from bs4 import BeautifulSoup# 设置要爬取的网站
url = "https://www.baidu.com/"
heder = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}# 爬取内容
res = requests.get(url, headers=heder)
# 获取内容
content = res.text  # 这里是让爬取的内容以文本的形式打开,同时保存到变量# 初始化Beatifulsoup
soup = BeautifulSoup(content, 'html.parser')
# 获取所有的a标签和input标签并以列表形式返回
list_a = soup.find_all('a', 'input')
# 输出显示获取到的a标签列表
for i in list_a:print(i)

(3)传入正则表达式

万金油表达式

# 找所有的xxx标签: 属性xxx满足对应正则表达式
soup.find_all(name='xxx',attrs={'xxx':re.compile('正则表达式')}

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

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

相关文章

xxl-job之API的方式接入

文章目录 1 xxl-job1.1 简介1.2 分析1.3 学习xxl-job源码1.4 改造项目1.4.1 接口调用1.4.1.1 对接登录接口1.4.1.2 对接执行器接口1.4.1.3 对接任务接口 1.4.2 创建新注解1.4.3 自动注册核心1.4.4 自动装配 1 xxl-job 1.1 简介 xxl-job是一款非常优秀的任务调度中间件&#x…

蓝桥杯-sort排序(上)

sort排序 &#x1f388;1.算法说明&#x1f388;2.例题&#x1f52d;2.1例题一&#x1f52d;2.2例题二&#x1f52d;2.3例题三&#x1f52d;2.4例题四&#x1f52d;2.5例题五&#x1f52d;2.6例题六 &#x1f388;1.算法说明 &#x1f50e;对于一个数组&#xff0c;通过对数组中…

数据结构与算法——队列

概述 计算机科学中&#xff0c;queue 是以顺序的方式维护的一组数据集合&#xff0c;在一端添加数据&#xff0c;从另一端移除数据。添加的一端称为尾&#xff0c;移除的一端称为头。 功能 插入offer(value : E) : boolean  取值并移除poll() : E  取值peek() : E  判断…

《繁花》黄河路至真园-UMLChina建模知识竞赛第5赛季第4轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。 如果有第4题&#xff0c;第4题为附加题&am…

HAL STM32基于系统滴答定时器(SysTick)实现多任务时间片轮询

HAL STM32基于系统滴答定时器&#xff08;SysTick&#xff09;实现多任务时间片轮询 &#x1f4d1;RTOS&#xff08;实时操作系统&#xff09;和定时器时间片轮询是两种不同的任务调度和执行方式的差异简介 &#x1f516; 以下部分内容&#xff0c;由AI给出的解答&#xff1a; …

【搞懂设计模式】中介模式:让代码更简洁,让程序更舒适!

中介模式的定义 在很多应用中&#xff0c;不同模块或者组件间的交互复杂且分散&#xff0c;这就难以管理和维护。在这种情况下&#xff0c;我们可以使用中介模式。在中介模式中&#xff0c;我们引入一个中介者对象&#xff0c;这个中介者就像是一个控制塔&#xff0c;负责处理…

Tomcat怎么优化

目录 性能方面的优化&#xff1a; 安全方面的优化&#xff1a; 引言&#xff1a;面试官问到的Tomcat怎么优化&#xff0c;这两个方面直接得到他认可&#xff01;&#xff01; 性能方面的优化&#xff1a; 内存优化&#xff1a;-Xms java虚拟机初始化时的最小内存、-Xmx java虚…

C语言-qsort的使用

1. qsort()函数简介 qsort&#xff08;&#xff09;函数是C语言库函数中的一种排序函数&#xff0c;排序方法为快速排序&#xff08;quick sort&#xff09; 。 其特点是可以排序任意类型的数组元素。 1.1 函数原型 void qsort(void* base, size_t num, size_t size, int (*co…

C++ 之LeetCode刷题记录(二十)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 依旧是追求耗时0s的一天。 110. 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二…

CMU15-445 Project0

CMU14445 Task #1 - Copy-On-Write Trie Get()思路&#xff1a; 获取根节点指针&#xff0c;顺着key逐字符往下找节点&#xff0c;最后根据题意可以使用dynamic_cast检查是否是TrieNodeWithValue&#xff08;dynamic_pointer_cast也可以)&#xff0c;以下为两者用法&#xff1…

签到业务流程

1.技术选型 Redis主写入查询&#xff0c;Mysql辅助查询&#xff0c;传统签到多数都是直接采用mysql为存储DB,在大数据的情况下数据库的压力较大.查询速率也会随着数据量增大而增加.所以在需求定稿以后查阅了很多签到实现方式,发现用redis做签到会有很大的优势.本功能主要用到r…

字节8年经验之谈 —— 如何编写出色的接口测试用例?

简介&#xff1a;在所有的开发测试中&#xff0c;接口测试是必不可少的一项。有效且覆盖完整的接口测试&#xff0c;不仅能保障新功能的开发质量&#xff0c;还能让开发在修改功能逻辑的时候有回归的能力&#xff0c;同时也是能优雅地进行重构的前提。编写接口测试要遵守哪些原…