爬虫 | 正则、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.mzph.cn/news/106829.shtml

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

相关文章

企业订货系统常见问题与解决方案|网站定制搭建|小程序APP开发

企业订货系统常见问题与解决方案|网站定制搭建|小程序APP开发 在企业经营中&#xff0c;订货系统是一个非常重要的工具&#xff0c;它可以帮助企业快速地获取客户需求&#xff0c;制定生产计划&#xff0c;提高供应链效率&#xff0c;帮助企业快速、准确地计算出所需物资的数量…

基于R和gephi做宏基因组与代谢组等多组学联合network相关性网络图

写在前面 拿到多组学的数据后一直在找合适的方法将二者进行关联&#xff0c;比如我这里是三种体液的代谢组与一种体液的宏基因组。需求是对多组学进行关联分析&#xff0c;直到最近看到不少文章里利用Gephi将相关性表格进行可视化的图&#xff0c;效果还不错&#xff0c;于是写…

Vue3集成高德地图:快速上手,实现你的业务需求

Vue3集成高德地图 前言一、准备工作1.开发文档2.添加应用 二、使用步骤命令安装2.地图容器创建3.组件引入4.js api 安全密钥5.初始化地图6. 图层6.1 添加 / 设置 / 获取 / 移除图层6.1.1 添加图层6.1.2 设置图层6.1.3 获取图层6.1.4 移除图层 7. 点标记8. 信息窗体8.1 默认信息…

【微服务】微服务初步认识 - 微服务技术如何学习 · 认识微服务架构

微服务&#xff08;1&#xff09; 文章目录 【微服务】&#xff08;1&#xff09;1. 微服务相关技术栈2. 微服务学习路线3. 认识微服务架构3.1 单体架构3.2 分布式架构3.3 微服务(架构)3.4 微服务(架构)治理落实相关的SpringCloud、SpringCloudAlibaba和阿里巴巴的Dubbo提供的服…

226、翻转二叉树

题目链接&#xff1a; \sf 题目链接&#xff1a; 题目链接&#xff1a; 图解&#xff1a; 方法一、 D F S \sf 方法一、DFS 方法一、DFS 递归&#xff1a; 让左子树是翻转后的右子树&#xff0c; 右子树是翻转后的左子树。 ∴从叶结点开始&#xff0c;自底向上逐步翻转。递归出…

Elucidating the Design Space of Diffusion-Based Generative Models 阅读笔记

文章使用模块化&#xff08;modular&#xff09;的思想&#xff0c;分别从采样、训练、score network设计三个方面分析和改进diffusion-based models。 之前的工作1已经把diffusion-based models统一到SDE或者ODE框架下了&#xff0c;这篇文章的作者同样也从SDE和ODE的角度出发…

文件路径操作

避开-转义字符 python文件路径导致的错误常常与“\”有关&#xff0c;因为在路径中的“\”常会被误认为转义字符。 所以在上述路径中&#xff0c;\table\name\rain中的\t,\n,\r都易被识别为转义字符。 解决的办法主要由以下三种&#xff1a; #1 前面加r表示不转义 pathr&quo…

html资源提示符

前言&#xff1a;正常dom解析 中遇到script标签 &#xff0c;会暂停主线程 去下载js&#xff0c;拿到资源后&#xff0c;主线程再执行js。 那么主线程在等待网络线程下载这个空闲很浪费 解决方案&#xff1a; script标签增加属性 async defer 1.async <script src"./i…

[C++]:1.初识C++和C语言缺陷补充。

初识C和C语言缺陷补充 一.主要内容&#xff1a;二.具体内容&#xff1a;一&#xff1a; 作用域1.命名空间&#xff1a;2.函数声明和定义&#xff1a;3.不存在命名冲突的情况&#xff1a; 二.输入输出&#xff1a;1.基本输入输出&#xff1a;2.关于std的展开&#xff1a; 三.函数…

5+非肿瘤分析,分型+WGCNA+机器学习筛选相关基因

今天给同学们分享一篇非肿瘤分型机器学习WGCNA实验的生信文章“Identification of diagnostic markers related to oxidative stress and inflammatory response in diabetic kidney disease by machine learning algorithms: Evidence from human transcriptomic data and mou…

Windows网络系统架构

在介绍Windows网络体系架构之前&#xff0c;我首先介绍一下Windows中的两个重要编程规范——TDI&#xff0c;NDIS.&#xff0c;然后再介绍网络体系的架构。TDI&#xff0c;Transport Driver Interface&#xff0c;传输驱动程序接口。/Windows/System32/Drivers/Tdi.sys。在实现…

搜索引擎站群霸屏排名源码系统+关键词排名 前后端完整的搭建教程

开发搜索引擎站群霸屏排名系统是一项重要的策略&#xff0c;通过在搜索引擎中获得多个高排名站点&#xff0c;可以大大提高企业的品牌知名度&#xff0c;从而吸引更多的潜在客户和消费者。而且当潜在客户在搜索结果中看到多个与您的品牌相关的站点时&#xff0c;他们可能会认为…

Thread常用API

setname方法每个线程取名 需要创建构造器 线程设置名字 package Thread_api_test;// 继承Thread类 public class MyThread extends Thread {//创建构造器 线程设置名字public MyThread(String name){super(name);}Overridepublic void run() {super.run();Thread mThread.cur…

css 左右滚轮无缝衔接

最近的项目有做到一个功能 类似跑马灯或者公告栏那种 有文字 也有列表的 所以 写了两种 第一种公告栏文字是用的js 第二种图文类型是用的css 两种方法 记录一下 第一种 纯文字滚动 其实也是根据js去计算dom的宽度 通过js去给css赋值 <div class"div1"><div …

计网面试复习自用

五层&#xff1a; 应用层&#xff1a;应用层是最高层&#xff0c;负责为用户提供网络服务和应用程序。在应用层&#xff0c;用户应用程序与网络进行交互&#xff0c;发送和接收数据。典型的应用层协议包括HTTP&#xff08;用于网页浏览&#xff09;、SMTP&#xff08;用于电子邮…

【MySQL】事务四大特性ACID、并发事务问题、事务隔离级别

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 MySQL 一、事务四大特性ACID1.1 原子性1.2 …

车辆车型识别系统python+TensorFlow+Django网页界面+算法模型

一、介绍 车辆车型识别系统。本系统使用Python作为主要开发编程语言&#xff0c;通过TensorFlow搭建算法模型网络对收集到的多种车辆车型图片数据集进行训练&#xff0c;最后得到一个识别精度较高的模型文件。并基于该模型搭建Django框架的WEB网页端可视化操作界面。实现用户上…

【LeetCode刷题(数据结构与算法)】:二叉树之左叶子之和

给定二叉树的根节点 root &#xff0c;返回所有左叶子之和 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 24 示例 2: 输入: root [1] 输出: 0 这都题目用递归的方法就可以解决…

『C++之STL』双端队列 - deque

前言 双端队列,Double-ended queue,简称为deque是一种线性结构的一种容器; 在数据结构中出现的顺序表与链表,或者栈与队列都算是线性结构; 在结构中,它与vector相比较会相似一些; 但是在实际当中,双端队列 - deque 包含了vector与list的优点; vector(顺序表) 支持随机访问,空…

Vue3引入腾讯地图,点击坐标后实时获取经纬度

本文将介绍如何在Vue 引入腾讯地图组件&#xff0c;引入后可以直接在页面中渲染腾讯地图&#xff0c;实现 经纬度 与 地图锚点位置的双向绑定&#xff0c;如&#xff1a; 1&#xff0c;输入经纬度后&#xff0c;地图自动定位到指定位置&#xff1b;2&#xff0c;鼠标在地图点击…