【工程记录】Python爬虫入门记录(Requests BeautifulSoup)

目录

  • 写在前面
  • 1. 环境配置
  • 2. 获取网页数据
  • 3. 解析网页数据
  • 4. 提取所需数据
    • 4.1 简单提取
    • 4.2 多级索引提取
  • 5. 常见问题


写在前面

仅作个人学习与记录用。主要整理使用Requests和BeautifulSoup库的简单爬虫方法。在进行数据爬取时,请确保遵守相关法律法规和网站的服务条款,尊重数据版权和用户隐私。同时,合理安排爬虫的访问频率,避免对目标网站造成不必要的负担。

1. 环境配置

安装Requests
直接通过pip安装即可:pip install requests

安装BeatifulSoup
直接通过pip安装即可:pip install beautifulsoup4
注意导入库时不能import beautifulsoup4,需要import bs4

2. 获取网页数据

import requests
from bs4 import BeautifulSoup
#res = requests.post('url')
res = requests.get('url')

nginx等web服务器不允许post访问静态资源。因此如果使用post访问页面也是报错,可以尝试使用get方式访问。

如果在使用requests.get()requests.post()访问https请求时出现了SSLError,即显示Can’t connect to HTTPS URL because the SSL module is not available.时,需要将下述两种文件从bin文件夹复制到DLLs文件夹下:

libcrypto-1_1-x64.*
libssl-1_1-x64.*
[Anaconda安装路径]\Library\bin -> [Anaconda安装路径]\DLLs

如果是anaconda虚拟环境,需要将文件拷贝到相应的环境DLLs文件夹下,例如:

[Anaconda安装路径]\envs\[虚拟环境名]\Library\bin -> [Anaconda安装路径]\envs\[虚拟环境名]\DLLs

3. 解析网页数据

BeautifulSoup 是一个 Python 库,用于从 HTML 或 XML 文件中提取数据。它可以将复杂的 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python 对象,所有对象可以归纳为四种:

  • Tag
  • NavigableString
  • BeautifulSoup
  • Comment

以下是使用 BeautifulSoup 解析网页数据的代码:

import requests
from bs4 import BeautifulSoup
res = requests.get('url')
html = response.text
#利用BS库对网页进行解析,得到解析对象soup
soup = BeautifulSoup(html,'html.parser')

其中html.parser是Python 标准库中的内置解析器,不需要额外安装,但在某些情况下可能不如其他解析器强大或快速。以下是一些常用的第三方解析器:

  • lxml 解析器
    lxml 是一个第三方库,它提供了一个快速的 HTML 解析器。要使用 lxml 解析器,需要先安装 lxml 库。
    pip install lxml
    
    然后,在 BeautifulSoup 中使用它:
    soup = BeautifulSoup(html, 'lxml')
    
  • html5lib 解析器
    html5lib 是一个用于解析 HTML 的库,它根据 HTML5 标准来解析 HTML 文档。要使用 html5lib 解析器,您需要先安装 html5lib 库。
    pip install html5lib
    
    然后,在 BeautifulSoup 中使用它:
    soup = BeautifulSoup(html, 'html5lib')
    

在选择解析器时,lxml 通常是速度最快的选择。但是如果只需要解析基本的 HTML 文档,html.parser 可能就足够了。如果需要严格的 HTML5 解析,html5lib 是不错的选择,尽管它可能比其他解析器慢。

4. 提取所需数据

4.1 简单提取

得到目标网页的解析对象soup后,接下来将鼠标光标移动到所需的数据上,比如一个链接、一张图片或者一段文字。在鼠标定位到所需数据上之后,右键点击鼠标,会弹出一个上下文菜单。接下来在弹出的上下文菜单中选择“检查”(Chrome、Firefox、Edge等常用浏览器都有此选项),或者通过快捷键(Ctrl+Shift+I)直接打开。

最后需要定位HTML元素:点击“检查”后,浏览器会打开开发者工具,并自动选中与鼠标位置相对应的HTML元素。在这里,可以找到该数据在网页源代码中的位置和结构。

例如抓取下述图书的名称:

在这里插入图片描述得到:

在这里插入图片描述可以发现图书名称是在如下标签中的:

<span property="v:itemreviewed">景观社会</span>

因此可以设计如下代码查询:

book_title_tag = soup.find("span", property="v:itemreviewed")
book_title_tag = book_title_tag.contents[0]
if book_title_tag:book_title = book_title_tag.get_text()print('书名:', book_title)
else:print('未找到书名')

find方法只会返回第一个匹配的元素。如果你需要查找所有的匹配元素,可以使用find_all方法,它会返回一个包含所有匹配元素的列表ResultSet。

注意find_all()方法和find()函数返回的分别是ResultSet和一个Tag,访问ResultSet和Tag的内容需要使用下标:

.content[n]	

而访问列表元素的下一级元素同样使用.contents[n]来访问:

.content[n].contents[m]	

以下列举的是一些常用的提取方法:

  1. 通过标签名查找

        title = soup.find('title')print(title.text)  # 输出标签内的文本
    
  2. 通过属性查找

        link = soup.find('a', {'href': 'http://example.com'})print(link.text)
    
  3. 提取所有匹配的元素

    links = soup.find_all('a')
    for link in links:print(link.get('href'))
    
  4. 嵌套选择

    div = soup.find('div', {'class': 'some-class'})
    links = div.find_all('a')
    
  5. 提取标签内的文本

    p = soup.find('p')
    print(p.text)
    
  6. 提取属性

    img = soup.find('img')
    print(img.get('src'))
    
  7. 提取多个属性

    img = soup.find('img')
    attributes = img.attrs
    print(attributes['src'], attributes['alt'])
    
  8. 按类查找

    items = soup.find_all(class_='item')
    
  9. 按 ID 查找

    element = soup.find(id='some-id')
    
  10. 使用 CSS 选择器

    paragraphs = soup.select('p.some-class')
    for p in paragraphs:print(p.text)
    

4.2 多级索引提取

与上一节的简单提取方法不同,在BeautifulSoup中,多级索引是指通过多个层级的选择来定位特定的HTML元素。这通常涉及到使用不同的HTML标签和属性来逐步缩小搜索范围,直到找到需要的特定元素。

以下是一个使用BeautifulSoup进行多级索引的示例:

import requests
from bs4 import BeautifulSoupurl = 'http://example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')# 假设要找的元素在一个id为'parent'的div内,然后是一个class为'child'的span内
parent_div = soup.find('div', id='parent')
if parent_div:child_span = parent_div.find('span', class_='child')if child_span:# 现在我们可以提取child_span中的文本或者执行其他操作text = child_span.get_text()print('找到的文本:', text)else:print('未找到class为child的span')
else:print('未找到id为parent的div')

首先通过find方法找到了idparentdiv元素,然后在这个div元素中继续使用find方法查找classchildspan元素。这种方法可以一直递归下去,直到找到所需要的特定元素。
此外,BeautifulSoup还支持CSS选择器,这使得多级索引更加直观。例如,如果你想要选择idparentdiv内所有classchildspan元素,可以使用如下选择器:

child_spans = soup.select('div#parent > span.child')

这将返回一个包含所有匹配span元素的列表。

5. 常见问题

(1)网页中的中文内容在使用requests获取后,中文乱码无法识别:【解决方法】

持续更新

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

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

相关文章

Ubuntu安装Neo4j

Ubuntu&#xff08;在线版&#xff09; 更新软件源 sudo apt-get update 添加Neo4j官方存储库 wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add - 将地址添加到系统的软件包源列表中 echo deb https://debian.neo4j.com stable latest | su…

二分图--判定以及最大匹配

水了个圈钱杯省一&#xff0c;不过估计国赛也拿不了奖&#xff0c;但还是小小挣扎一下。 什么是二分图&#xff1a;G(V,E)是一个无向图&#xff0c;若顶点V可以分为两个互不相交的子集A,B&#xff0c;并图中的每一条边&#xff08;i,j)所关联的ij属于不同的顶点集&#xff0c;…

Java image-processing 包依赖错误

错误的信息为&#xff1a; [ERROR] Failed to execute goal on project image-processing: Could not resolve dependencies for project com.ossez:image-processing:jar:0.0.2-SNAPSHOT: Failed to collect dependencies at org.openimaj:core-image:jar:1.3.10 -> org.op…

spring-boot示例

spring-boot版本&#xff1a;2.0.3.RELEASE 数据库: H2数据库 &#xff08;嵌入式内存性数据库&#xff0c;安装简单&#xff0c;方便用于开发、测试&#xff0c;不适合用于生产&#xff09; mybatis-plus框架&#xff0c;非常迅速开发CRUD

SpringMVC整体工作流程

. 用户发起一个请求&#xff0c;请求首先到达前端控制器前端控制器接收到请求后会调用处理器映射器&#xff0c;由此得知&#xff0c;这个请求该由哪一个Controller来进行处理(并未调用Controller)&#xff1b;前端控制器调用处理器适配器&#xff0c;告诉处理器适配器应该要…

Macos安装OrbStack

什么是OrbStack OrbStack 是一种在 macOS 上运行容器和 Linux 机器的快速、轻便和简单方法。它是 Docker Desktop 和 WSL 的超强替代品&#xff0c;所有这些都在一个易于使用的应用程序中。 在Macos M系列芯片上&#xff0c;经常遇到docker镜像不兼容的问题&#xff0c;此时使…

ubuntu的镜像源+bionic版本

首先第一步 查找和你自己ubuntu版本匹配的版本号 匹配代号如下 在终端输入lsb_release -a查看自己系统上的版本号 可以看到我这个版本号的代号是bionic。 每个版本的镜像文件都是有规律的。 bionic版本的源如下 # 阿里源 deb http://mirrors.aliyun.com/ubuntu/ bionic ma…

Linux内核之页面映射到虚拟地址:insert_page用法实例(六十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

vscode连接阿里云 无法连接

如果是首次连接&#xff0c;需要在阿里云控制台下 点击重置密码 同时注意在重置密码页面最下方&#xff0c;有开启密码登录选项

Nginx实现端口转发与负载均衡配置

前言&#xff1a;当我们的软件体系结构较为庞大的时候&#xff0c;访问量往往是巨大的&#xff0c;所以我们这里可以使用nginx的均衡负载 一、配置nginx实现端口转发 本地tomcat服务端口为8082 本地nginx端口为8080 目的&#xff1a;将nginx的8080转发到tomcat的8082端口上…

SOLIDWORKS DRAFTSIGHT 2024新功能Top10

SOLIDWORKS 2024 以更加强大的姿态亮相&#xff0c;帮助您重塑设计。为了助力您简化和加快由概念到成品的产品开发流程&#xff0c;SOLIDWORKS 2024 涵盖全新以用户为中心的增强功能&#xff0c;致力帮您实现更智能、更快速地与您的团队和外部合作伙伴协同工作&#xff0c;下面…

C语言 循环语句 (1) 讲述循环概念演示while语句

接下来 我们来说 循环控制结构 循环的基本原理及循环语句 再说原理之前 我们 先来看几个案例 要求是 让用户在键盘中输入三个整数 然后将这些整数求和 这个用我们之前的知识就能轻松搞定 #define _CRT_SECURE_NO_WARNINGS//禁用安全函数警告 #pragma warning(disable:6031)…

MyBatis(XML映射器操作)

文章目录 XML映射器操作&#xff08;XxxMapper.xml&#xff09;文件目录1.基本介绍1.优点2.常用顶级元素 2.环境配置1.在原来的父模块下创建一个子模块2.删除没用的两个文件夹3.创建基本目录4.父模块的pom.xml5.jdbc.properties6.mybatis-config.xml7.测试使用MonsterMapperTes…

FSNotes for Mac v6.7.1中文激活:轻量级笔记管理工具

FSNotes for Mac&#xff0c;一款专为Mac用户打造的轻量级笔记管理工具&#xff0c;让您的笔记管理变得简单而高效。 FSNotes for Mac v6.7.1中文激活版下载 它采用Markdown文件格式&#xff0c;让您轻松创建和编辑富文本笔记&#xff0c;无需担心格式问题。同时&#xff0c;FS…

C++ | Leetcode C++题解之第59题螺旋矩阵II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> generateMatrix(int n) {int num 1;vector<vector<int>> matrix(n, vector<int>(n));int left 0, right n - 1, top 0, bottom n - 1;while (left < r…

十一、大模型-Semantic Kernel与 LangChain 的对比

Semantic Kernel 与 LangChain 的对比 Semantic Kernel 和 LangChain 都是用于开发基于大型语言模型&#xff08;LLM&#xff09;的应用程序的框架&#xff0c;但它们各有特点和优势。 基本概念和目标 Semantic Kernel 是一个由微软开发的轻量级 SDK&#xff0c;旨在帮助开发…

STM32标准库控制一盏LED闪烁

实物连接&#xff1a; ## 软件编程&#xff1a;默认已经有一个工程模板&#xff0c;代码实现逻辑&#xff1a; 1、使用RCC开启GPIO的时钟&#xff1b; 2、使用GPIO初始化函数实现初始化GPIO 3、使用输入或输出的函数控制GPIO口 #include "stm32f10x.h" …

Android(Java)项目支持Kotlin语言开发

Android&#xff08;Java&#xff09;项目通过相关Kotlin设置后&#xff0c;允许同时使用Java语言和Kotlin语言进行开发代码的。 示例环境&#xff1a; Android Studio Giraffe | 2022.3.1 Patch 3 Java 8 Kotlin 1.9.20 设置Kotlin选项&#xff1a; 第一步&#xff1a;在项…

数据链路层(计算机网络)

0、前言 本文大多数图片都来自于 B站UP主&#xff1a;湖科大教书匠 的教学视频&#xff0c;对高军老师及其团队制作出这么优质的课程表示感谢。本文的撰写目的不是为了应试&#xff0c;且受限于个人水平&#xff0c;可能和标准答案有所出入&#xff0c;请自行甄别&#xff0c;…

定制开发AI智能名片商城小程序:玩转积分制度的成功案例

在数字化浪潮席卷而来的今天&#xff0c;企业营销方式不断创新&#xff0c;力求在众多竞争对手中脱颖而出。其中&#xff0c;积分制度以其直观、有效的特点&#xff0c;成为了众多企业的营销利器。某时尚品牌“潮流前线”便是其中的佼佼者。他们通过定制一款AI智能名片商城小程…