【工程记录】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.rhkb.cn/news/319442.html

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

相关文章

FLIR LEPTON3.5 热像仪wifi 科研实验测温采集仪

点击查看详情!点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情点击查看详情 1、描述 这是一款桌面科研实验测温热成像多功能热像记录仪&#xff0c;小巧轻便…

SFOS1:开发环境搭建

一、简介 最近在学习sailfish os的应用开发&#xff0c;主要内容是QmlPython。所以&#xff0c;在开发之前需要对开发环境&#xff08;virtualBox官方SDKcmake编译器python&#xff09;进行搭建。值得注意的是&#xff0c;我的开发环境是ubuntu22.04。如果是windows可能大同小异…

带文字海报流程自动化

上一篇文章&#xff1a; 带文字海报流程自动化 - 知乎 项目代码整理在&#xff1a; https://github.com/liangwq/Chatglm_lora_multi-gpu​github.com/liangwq/Chatglm_lora_multi-gpu 根据用户的输入生成图片prompt模块代码封装&#xff1a; from openai import OpenAI im…

获取淘宝商品销量数据接口

淘宝爬虫商品销量数据采集通常涉及以下几个步骤&#xff1a; 1、确定采集目标&#xff1a;需要明确要采集的商品类别、筛选条件&#xff08;如天猫、价格区间&#xff09;、销量和金额等数据。例如&#xff0c;如果您想了解“小鱼零食”的销量和金额&#xff0c;您需要设定好价…

【云原生系列】云计算概念与架构设计介绍

1 什么是云计算 云计算是一种基于互联网的计算模式&#xff0c;在这个模式下&#xff0c;各种计算资源&#xff08;例如计算机、存储设备、网络设备、应用程序等&#xff09;可以通过互联网实现共享和交付。云计算架构设计的主要目标是实现高效、可扩展、可靠、安全和经济的计算…

C++多态特性详解

目录 概念&#xff1a; 定义及实现&#xff1a; 虚函数重写的两个例外&#xff1a; 1.协变&#xff1a; 2.析构函数的重写&#xff1a; final关键字&#xff1a; override关键字&#xff1a; 多态是如何实现的&#xff08;底层&#xff09;&#xff1a; 面试题&#xff1…

idea No versioned directories to update were found

idea如何配置svn以及svn安装时需要注意什么 下载地址&#xff1a;https://112-28-188-82.pd1.123pan.cn:30443/download-cdn.123pan.cn/batch-download/123-820/3ec9445a/1626635-0/3ec9445a25ba365a23fc433ce0c16f34?v5&t1714358478&s171435847804276f7d9249382ba512…

代码随想录算法训练营DAY40\DAY41|C++动态规划Part.3|343.整数拆分、96.不同的二叉搜索树

DAY40休息日&#xff0c;本篇为DAY41的内容 文章目录 343.整数拆分思路dp含义递推公式&#xff08;难点&#xff09;初始化遍历顺序打印 CPP代码数学方法归纳证明法 96.不同的二叉搜索树思路dp含义递推公式初始化遍历顺序打印 CPP代码题目总结 343.整数拆分 力扣题目链接 文章…

小蓝本--因式分解(习题1)讲解

这几天要备战期中&#xff0c;下一期可能要等暑假了...... 小升初的压力真是紧扣于头啊&#xff0c;为了分到一个好班&#xff0c;拼了&#xff01; 对了&#xff0c;下一期可能在寒假更&#xff0c;见谅&#xff01; 1分解因式&#xff1a; 公因式&#xff1a; 答案&#xff…

vue3--element-plus-抽屉文件上传和富文本编辑器

一、封装组件 article/components/ArticleEdit.vue <script setup> import { ref } from vue const visibleDrawer ref(false)const open (row) > {visibleDrawer.value trueconsole.log(row) }defineExpose({open }) </script><template><!-- 抽…

iptables---防火墙

防火墙介绍 防火墙的作用可以理解为是一堵墙&#xff0c;是一个门&#xff0c;用于保护服务器安全的。 防火墙可以保护服务器的安全&#xff0c;还可以定义各种流量匹配的规则。 防火墙的作用 防火墙具有对服务器很好的保护作用&#xff0c;入侵者必须穿透防火墙的安全防护…

排序算法--快速排序

前提&#xff1a; 快速排序(Quicksort)是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另外一部分的所有数据都要小&#xff0c;然后再按此方法对这两部分…

【Leetcode每日一题】 综合练习 - 全排列 II(难度⭐⭐)(71)

1. 题目解析 题目链接&#xff1a;47. 全排列 II 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 算法思路梳理 为了生成给定数组nums的全排列&#xff0c;同时避免由于重复元素导致的重复排列&#xff0c;我们可以遵…

快速上手RabbitMQ

安装RabbitMQ 首先将镜像包上传到虚拟机&#xff0c;使用命令加载镜像 docker load -i mq.tar 运行MQ容器 docker run \-e RABBITMQ_DEFAULT_USERitcast \-e RABBITMQ_DEFAULT_PASS123321 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 …

如何使用 GPT API 从 PDF 出版物导出研究图表?

原文地址&#xff1a;how-to-use-gpt-api-to-export-a-research-graph-from-pdf-publications 揭示内部结构——提取研究实体和关系 2024 年 2 月 6 日 介绍 研究图是研究对象的结构化表示&#xff0c;它捕获有关实体的信息以及研究人员、组织、出版物、资助和研究数据之间的关…

brpc profiler

cpu profiler cpu profiler | bRPC MacOS的额外配置 在MacOS下&#xff0c;gperftools中的perl pprof脚本无法将函数地址转变成函数名&#xff0c;解决办法是&#xff1a; 安装standalone pprof&#xff0c;并把下载的pprof二进制文件路径写入环境变量GOOGLE_PPROF_BINARY_PA…

Microsoft 365 for Mac(Office 365)v16.84正式激活版

office 365 for mac包括Word、Excel、PowerPoint、Outlook、OneNote、OneDrive和Teams的更新。Office提供了跨应用程序的功能&#xff0c;帮助用户在更短的时间内创建令人惊叹的内容&#xff0c;您可以在这里创作、沟通、协作并完成重要工作。 Microsoft 365 for Mac(Office 36…

1. 深度学习笔记--神经网络中常见的激活函数

1. 介绍 每个激活函数的输入都是一个数字&#xff0c;然后对其进行某种固定的数学操作。激活函数给神经元引入了非线性因素&#xff0c;如果不用激活函数的话&#xff0c;无论神经网络有多少层&#xff0c;输出都是输入的线性组合。激活函数的意义在于它能够引入非线性特性&am…

【webrtc】MessageHandler 7: 基于线程的消息处理:切换main线程向observer发出通知

以当前线程作为main线程 RemoteAudioSource 作为一个handler 仅实现一个退出清理的功能 首先on message的处理会切换到main 线程 :main_thread_其次,这里在main 线程对sink_ 做清理再次,在main 线程做出状态改变,并能通知给所有的observer 做出on changed 行为。对接mediac…

clang:在 Win10 上编译 MIDI 音乐程序(二)

先从 Microsoft C Build Tools - Visual Studio 下载 1.73GB 安装 "Microsoft C Build Tools“ 访问 Swift.org - Download Swift 找到 Windows 10&#xff1a;x86_64 下载 swift-5.10-RELEASE-windows10.exe 大约490MB 建议安装在 D:\Swift\ &#xff0c;安装后大约占…