爬虫 | 正则、Xpath、BeautifulSoup示例学习

文章目录

  • 📚import requests
  • 📚import re
  • 📚from lxml import etree
  • 📚from bs4 import BeautifulSoup
  • 📚小结

契机是课程项目需要爬取一份数据,于是在CSDN搜了搜相关的教程。在博主【朦胧的雨梦】主页学到很多😄。本文基于大佬给出的实例学习记录自用。以下将相关博客列出,推荐学习~

  • Python |浅谈爬虫的由来
  • Python爬虫 | 利用python爬虫获取想要搜索的数据
  • Python爬虫经典战役——正则实战
  • Python爬虫| 一文掌握XPath
  • Python爬虫之美丽的汤——BeautifulSoup

📚import requests

  • 使用模板

    import requests   
    url ='xxxxxxxxxxxx' 
    #发送请求                              
    response = request.get(url, params,headers)  (get请求或者post请求)  
    #根据相应的格式解码
    response.encoding=response.appareent_encoding
    

  • 在爬虫应用中,伪装请求头里的User-Agent和Cookie具有以下作用和目的:

    • User-Agent:User-Agent是HTTP请求头的一部分,用于告诉服务器发送请求的客户端的信息,其中常用的是浏览器标识。在爬虫中,通过设置一个合适的User-Agent,可以模拟不同的浏览器或客户端发起请求,使得请求看起来更像是来自真实的人而不是自动化程序。有些网站可能会根据User-Agent的不同来返回不同的内容,所以在编写爬虫时,设置合适的User-Agent可以提高请求的成功率。
    • Cookie:Cookie是存储在客户端(浏览器)中的一小段数据,用于跟踪用户的会话状态。在爬虫中,有些网站会使用Cookie来记录用户的登录状态、浏览历史等信息。为了模拟用户登录状态或以合适的身份进行访问,我们可以在请求头中添加Cookie信息。通过使用合适的Cookie值,可以使请求看起来更像是经过登录验证的用户发起的请求,从而获取到需要登录才能访问的内容。
  • 通过伪装请求头中的User-Agent和Cookie,可以增加爬虫对目标网站的访问成功率,避免被服务器拒绝访问或返回错误的内容。另外,在使用伪装请求头时,需要注意遵守网站的使用规则和避免非法操作,以免违反相关法律法规或引起不必要的麻烦。


  • 代码精读

    import requestsdata = input('输入你想要查找的数据:').split()
    # 地址
    url ='http://www.baidu.com/s'# 伪装请求头
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36','Cookie': 'BIDUPSID=CDE3B4BEE7AE0D336C4D0734E42BCF8B; PSTM=1664331801; BAIDUID=CDE3B4BEE7AE0D33996D27FED1DDB4DB:FG=1; BD_UPN=12314753; BDUSS=JNdXVzTXMyWmFKM0x1VWJ5eG9GUjg4UmVCRFQxY1dtejBPVDFBfjc0VHhYRnRqRVFBQUFBJCQAAAAAAAAAAAEAAACse3WjanNuZGJpZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPHPM2PxzzNjTT; BDUSS_BFESS=JNdXVzTXMyWmFKM0x1VWJ5eG9GUjg4UmVCRFQxY1dtejBPVDFBfjc0VHhYRnRqRVFBQUFBJCQAAAAAAAAAAAEAAACse3WjanNuZGJpZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPHPM2PxzzNjTT; newlogin=1; ZFY=utLrULRdQjGdhXHuTriamg7jZ2PZMLmnKmUCBUiVrTw:C; BAIDUID_BFESS=CDE3B4BEE7AE0D33996D27FED1DDB4DB:FG=1; BA_HECTOR=ag04ah242k2l2h0la0010ofe1ho8t901f; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; COOKIE_SESSION=765400_1_9_9_5_15_1_0_9_7_0_0_1292084_0_0_0_1668919087_1669684425_1669684425%7C9%234656831_6_1669684425%7C3; B64_BOT=1; BDRCVFR[7FEYkXni5q3]=mk3SLVN4HKm; BD_HOME=1; H_PS_PSSID=26350; BD_CK_SAM=1; PSINO=3; delPer=1; H_PS_645EC=3d48biiwjEvDlNFtMaUHuepsRu67OxRgPoEiOrMKvfRketUwB4GowDbv4KmDa%2BaTHUgCCoc; baikeVisitId=e1f583c7-eb15-4940-a709-054666f30f48; BDSVRTM=443'
    }data = {# 'wd'​是百度搜索的关键字参数'wd': data
    }
    # 获得响应
    response = requests.get(url=url, params=data, headers=headers)
    # 智能解码
    response.encoding = response.apparent_encoding
    # 返回响应内容
    print(response.text)
    

📚import re

在这里插入图片描述

  • 贪婪匹配,尽可能多的匹配字符:.*
  • 非贪婪匹配,尽可能少的匹配字符:.*?

  • 代码精读

    import requests
    import re# 目标网页的URL
    url = 'https://movie.douban.com/top250'
    # 请求头信息
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36'
    }
    # 使用requests库发送GET请求,获取目标网页的内容,并将其编码为对应的字符编码格式。
    response = requests.get(url=url, headers=headers)
    response.encoding = response.apparent_encoding
    # 响应内容的文本形式,存储在变量h
    h = response.text
    # 通过正则表达式模式匹配和提取电影信息
    pattern = re.compile(r'<img width="100" alt="(?P<name>.*?)"'r'.*?<p class="">.*? 'r'导演: (?P<director>.*?)&nbsp.*?'r'主演: (?P<actors>.*?)<br>'r'(?P<year>.*?)&nbsp;.*?'r'/&nbsp;(?P<country>.*?)&nbsp;.*?'r';(?P<type>.*?)</p>.*?'r'<span class="rating_num" property="v:average">(?P<mark>.*?)</span>.*?'r'<span>(?P<evaluate>.*?)</span>', re.S)
    # 在字符串h中搜索与pattern匹配的内容,并返回一个迭代器对象
    result = pattern.finditer(h)
    for item in result:with open('豆瓣电影信息.txt', 'a', encoding='utf-8') as fp:fp.write('\n')# 使用group方法获取每个匹配项中各个信息字段的值fp.write(item.group('name'))# 写入文件fp.write('\n')fp.write(item.group('director'))fp.write('\n')fp.write(item.group('actors'))fp.write('\n')fp.write(item.group('year').strip())fp.write('\n')fp.write(item.group('country'))fp.write('\n')fp.write(item.group('type'))fp.write('\n')fp.write(item.group('mark'))fp.write('\n')fp.write(item.group('evaluate'))fp.write('\n')
    print('爬取完成')
    

    在这里插入图片描述


在这里插入图片描述在这里插入图片描述


  • <img width="100" alt="(?P<name>.*?)"
    • 匹配电影海报的img标签,其中包含了电影名称。(?P<name>.*?)使用?P<name>为该匹配项命名为’name’,并使用非贪婪模式匹配任意字符。

  • .*?<p class="">.*?
    • 匹配电影信息中的起始标签<p class="">之后的任意字符。

  • 导演: (?P<director>.*?)&nbsp.*?
    • 匹配导演姓名,导演姓名使用(?P<director>.*?)命名为’director’,并使用非贪婪模式匹配任意字符。

  • 主演: (?P<actors>.*?)<br>
    • 匹配主演姓名,主演姓名使用(?P<actors>.*?)命名为’actors’,并使用非贪婪模式匹配任意字符。该部分以<br>标签结尾。

  • (?P<year>.*?)&nbsp;.*?
    • 该部分匹配包含电影年份的文本,年份使用(?P<year>.*?)命名为’year’,并使用非贪婪模式匹配任意字符。该部分以&nbsp;结尾。

  • /&nbsp;(?P<country>.*?)&nbsp;.*?
    • 匹配电影国家/地区,国家/地区使用(?P<country>.*?)命名为’country’,并使用非贪婪模式匹配任意字符。该部分以&nbsp;结尾。

  • ;(?P<type>.*?)</p>.*?
    • 匹配包含电影类型的文本,类型使用(?P<type>.*?)命名为’type’,并使用非贪婪模式匹配任意字符。该部分以;</p>标签结尾。

  • <span class="rating_num" property="v:average">(?P<mark>.*?)</span>.*?
    • 匹配电影评分,评分使用(?P<mark>.*?)命名为’mark’,并使用非贪婪模式匹配任意字符。该部分以<span class="rating_num" property="v:average"></span>标签结尾。

  • <span>(?P<evaluate>.*?)</span>
    • 匹配电影评价,评价使用(?P<evaluate>.*?)命名为’evaluate’,并使用非贪婪模式匹配任意字符。该部分以<span></span>标签结尾。

📚from lxml import etree

  • 代码精读
    import requests
    from lxml import etree
    # 需要请求的url
    url = 'https://www.duanmeiwen.com/xinshang/3203373.html'
    # 伪装请求头
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
    }
    # 获得响应
    response = requests.get(url=url, headers=headers)
    # 智能解码
    response.encoding = response.apparent_encoding# 提取数据
    # 使用etree.HTML函数将HTML文本转换为可进行XPath操作的树结构对象tree。
    tree = etree.HTML(response.text)
    # 指定了要提取的目标位置
    # 即在HTML文档中,位于/html/body/div[2]/div[2]/div/div[2]/h2这个路径下的<h2>标签。
    # div[2]表示选择第二个div元素
    # text()表示提取选定元素的文本内容。
    # 将结果存储在titles变量
    titles = tree.xpath('/html/body/div[2]/div[2]/div/div[2]/h2/text()')
    # 同上
    message = tree.xpath('/html/body/div[2]/div[2]/div/div[2]/p/text()')#遍历保存数据
    for i in range(len(message)):with open('优美文艺句子.txt', 'a', encoding='utf-8') as fp:fp.write(message[i])fp.write('\n')
    print('文章爬取完成')
    

在这里插入图片描述

📚from bs4 import BeautifulSoup

在这里插入图片描述
在这里插入图片描述


  • 代码精读

    import requests
    from bs4 import BeautifulSoup# 需要请求的url
    url = 'https://www.starbucks.com.cn/menu/'
    # 伪装请求头
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
    }
    # 获得响应
    response = requests.get(url=url, headers=headers)
    # 智能解码
    response.encoding = response.apparent_encoding# 提取数据
    soup = BeautifulSoup(response.text, 'lxml')
    # 通过选择器找到了class为"grid padded-3 product"的ul元素下的strong标签,并将其结果存储在name_list变量中
    name_list = soup.select('ul[class="grid padded-3 product"] strong')
    print(name_list)# 保存数据
    for i in name_list:with open('星巴克.txt', 'a', encoding='utf-8') as fp:# 提取HTML或XML文档中指定元素的文本内容fp.write(i.get_text())fp.write('\n')
    print('文章爬取完成')
    

    在这里插入图片描述

    在这里插入图片描述

📚小结

在爬虫应用中,常用的第三方库包括requests、re、lxml和beautifulsoup。

  • requests库:requests是一个功能强大且易于使用的HTTP库,用于发送HTTP请求。它可以方便地进行网页的访问和数据的获取,包括发送GET和POST请求,设置请求头、参数、Cookie等,并获取响应结果。它可以用于下载网页内容、API数据等。

  • re库:re是Python内置的正则表达式库,它提供了丰富的方法来处理字符串匹配和替换的操作。在爬虫应用中,re经常被用来从HTML页面或文本中提取所需的信息,比如通过正则表达式来匹配特定的文本内容或URL。

  • lxml库:lxml是一个用于解析XML和HTML的库,并提供了XPath和CSS选择器等灵活的选择器语法,用于定位和提取HTML或XML文档中的元素和文本。lxml库具有高效的解析速度和稳定的性能,在爬虫应用中经常被用来解析HTML页面,提取所需的数据。

  • BeautifulSoup库:BeautifulSoup库是基于lxml或者html.parser库构建的Python库,用于将HTML或XML文档解析为可以操作和搜索的树形结构,更方便地进行数据提取。BeautifulSoup提供了直观而简洁的API,可以使用选择器语法来定位元素、获取文本内容、提取属性等。它还具有处理错误和不完整的HTML文档的能力,方便地处理各种网页结构。在爬虫应用中,BeautifulSoup经常被用来解析和处理网页数据,从中提取所需的信息。

这些库在爬虫应用中通常是相互配合使用的,requests用于发送HTTP请求获取网页内容,re用于对网页内容进行正则匹配提取,lxml用于解析网页内容,而BeautifulSoup则用于定位和提取所需的数据。

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

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

相关文章

EfficientDet: Scalable and Efficient Object Detection

CVPR2020 V7 Mon, 27 Jul 2020 引用量&#xff1a;243 机构&#xff1a;Google 贡献&#xff1a;1>提出了多尺度融合网络BiFPN 2>对backbone、feature network、box/class prediction network and resolution进行复合放缩&#xff0c;有着不同的…

Vmware Linux虚拟机安装教程(Centos版)

文章目录 1.Vmware-workstation安装软件2.双击下载的安装包开始安装3.打开VMware-workstation&#xff0c;输入密钥4.Centos7.6安装软件5.新建虚拟机6.为虚拟机配置映像文件7.开启虚拟机&#xff0c;配置环境7.1 Install Centos 77.2 选择简体中文字体7.3 软件选择7.4 安装位置…

Python 字典

目录 1 字典介绍2 字典的创建3 字典元素的访问4 字典元素添加、修改、删除5 序列解包6 表格数据使用字典和列表存储&#xff0c;并实现访问7 字典核心底层原理(重要)7.1 将一个键值对放进字典的底层过程7.2 扩容7.3 根据键查找“键值对”的底层过程7.4 用法总结&#xff1a; 声…

Linux 系统安装 Redis7 —— 超详细操作演示!

内存数据库 Redis7 一、Redis 概述1.1 Redis 简介1.2 Redis 的用途1.3 Redis 特性1.4 Redis 的IO模型 二、Redis 的安装与配置2.1 Redis 的安装2.2 连接前的配置2.3 Redis 客户端分类2.4 Redis 配置文件详解 三、Redis 命令四、Redis 持久化五、Redis 主从集群六、Redis 分布式…

【C++基础】10. 指针

文章目录 【 1. 指针的定义 】【 2. 指针的调用 】【 3. NULL 空指针 】【 4. 指针的算术运算 】4.1 指针的递加4.2 指针的递减4.3 指针的比较 【 5. 指针与数组 】5.1 通过指针操作数组5.2 指针数组、数组指针 【 6. 指向指针的指针(多级间接寻址)】【 7. 传递指针给函数 】【…

B树、B+树详解

B树 前言   首先&#xff0c;为什么要总结B树、B树的知识呢&#xff1f;最近在学习数据库索引调优相关知识&#xff0c;数据库系统普遍采用B-/Tree作为索引结构&#xff08;例如mysql的InnoDB引擎使用的B树&#xff09;&#xff0c;理解不透彻B树&#xff0c;则无法理解数据…

Ubuntu 23.10 Beta 镜像开放下载

导读Canonical放出了 Ubuntu 23.10 Beta 镜像&#xff0c;此外 Edubuntu、Kubuntu、Lubuntu、Ubuntu Budgie、Ubuntu Cinnamon、Ubuntu Kylin、Ubuntu MATE、Ubuntu Studio、Ubuntu Unity 和 Xubuntu 等风味版本也同步放出镜像。 近日消息&#xff0c;Canonical 放出了 Ubuntu …

LoRA 是如何工作的?

概述 纯笔记 LoRA的原理 LoRA其实是对稳定扩散模型最关键的部分进行了微小的改变。 这个关键的部分叫&#xff1a;cross-attention layers – 交叉注意力层。 研究人员发现&#xff0c;对这关键部分进行微调就足以实现良好的训练。 上面黄色部分&#xff0c;QKV 部分就是&a…

K8S:Rancher管理 Kubernetes 集群

文章目录 一.Rancher 简介1.Rancher概念2.Rancher 和 k8s 的区别 二.Rancher 安装及配置1.安装 rancher2.登录 Rancher 平台3.Rancher 管理已存在的 k8s 集群4.Rancher 部署监控系统5.使用 Rancher 仪表盘管理 k8s 集群 三.拓展1.Rancher和kubesphere相比较2.K3S和K8S相比较 一…

Opencv——颜色模型+通道分离与合并

视频加载/摄像头调用 VideoCapture允许一开始定义一个空的对象 VideoCapture video VideoCapture(const String &filename,int apiPreferenceCAP_ANY) filename:读取的视频文件或者图像序列名称 apiPreference:读取数据时设置的属性&#xff0c;例如编码格式、是否调用Op…

转化限制+分析变量变化引起的答案变化:Gym - 104065D

https://vjudge.net/contest/587311#problem/H 先转化一波条件&#xff1a; p i ≥ 1 X p_i\ge \frac 1 X pi​≥X1​ p i ≤ 1 1 − Y p_i\le \frac 1 {1-Y} pi​≤1−Y1​ 所以我们按 p p p 排序&#xff0c; s u m x sum_x sumx​ 必然是后缀&#xff0c; s u m y sum_y …

线性回归原理

1、 线性回归的原理 1.1 线性回归应用场景 房价预测 销售额度预测 金融:贷款额度预测、利用线性回归以及系数分析因子1.2 什么是线性回归 1.2.1定义与公式 线性回归(Linear regression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的…

VMware和Debian下载

文章目录 ⭐️写在前面的话⭐️一、VMware二、Debain三、建立虚拟机&#x1f680; 先看后赞&#xff0c;养成习惯&#xff01;&#x1f680;&#x1f680; 先看后赞&#xff0c;养成习惯&#xff01;&#x1f680; ⭐️写在前面的话⭐️ CSDN主页&#xff1a;程序员好冰 目前在…

模型UV纹理设置工具

1、什么是模型UV纹理&#xff1f; 模型的UV纹理是将二维纹理图映射到三维模型表面的过程。UV纹理可以为模型赋予颜色、纹理、细节和其他效果&#xff0c;使其看起来更加逼真。 2、UV纹理的原理 下面是模型UV纹理的详细原理介绍&#xff1a; UV坐标系统&#xff1a;UV坐标系统…

乐器经营商城小程序的作用是什么

乐器产品覆盖的人群非常广&#xff0c;小学生、老年人都有不小需求&#xff0c;也因此市场中的从业商家相对较多&#xff0c;产品丰富可供消费者选购&#xff0c;然而在实际经营中&#xff0c;线上线下面临痛点不少。 通过【雨科】平台搭建乐器小程序商城&#xff0c;将所有产品…

DarkGate恶意软件通过消息服务传播

导语 近日&#xff0c;一种名为DarkGate的恶意软件通过消息服务平台如Skype和Microsoft Teams进行传播。它冒充PDF文件&#xff0c;利用用户的好奇心诱使其打开&#xff0c;进而下载并执行恶意代码。这种攻击手段使用了Visual Basic for Applications&#xff08;VBA&#xff0…

JavaSE学习值之--认识异常

&#x1f495;"有效知识的前提是承认知识边界&#xff0c;承认我们对边界那边的一切无可奉告。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;JavaSE学习值之--认识异常 一.什么是异常&#xff1f; 异常就是程序在运行的时候产生的不正常的行为 …

多机器人三角形编队的实现

文章目录 前言一、机器人编队前的准备二、配置仿真环境2.编写机器人编队.cpp文件 三、三角形编队测试 前言 前阵子一直想要实现多机器人编队&#xff0c;找到了很多开源的编队代码&#xff0c;经过好几天的思索&#xff0c;终于实现了在gazebo环境中的TB3三角形机器人编队。 一…

SQL Server远程登录失败

SQL Server远程登录失败 检查SQL SERVER 是否允许远程访问. 具体步骤: 1)在远端SQL Server主机上,打开SSMS并连接数据库 2)在相应”数据库”上单击右键,选择”属性” 3)选择”连接”选项卡,检查”远程服务器连接”下,RPC服务是否选择. 设置SQL Server相关TCP连接 1.打开SQL Se…

Netty 入门 — 亘古不变的Hello World

这篇文章我们正式开始学习 Netty&#xff0c;在入门之前我们还是需要了解什么是 Netty。 什么是 Netty 为什么很多人都推崇 Java boy 去研究 Netty&#xff1f;Netty 这么高大上&#xff0c;它到底是何方神圣&#xff1f; 用官方的话说&#xff1a;Netty 是一款异步的、基于事…