爬虫数据提取-正则表达式re提取网页数据信息

2023-11-11

经过上一期我们介绍了xpath和beautifulsoup4提取数据之后,本章我们介绍一种新的提取数据的方法,就是正则表达是提取数据。
首先我们介绍什么是正则表达式,正则表达式就是按照一定的规则,从某个字符串中匹配出想要的数据,这个规则就是正则表达式。
import re#这个就是正则表达式的库
对于单字符匹配

import re
text='abc'
result=re.match('a',text)#从text中匹配a元素

下面我介绍一下所有的正则表达式的规则

. -表示匹配任意字符
\D - 表示匹配任意非数字
\d - 表示匹配任意数字
\s - 表示空白字符
\S - 表示非空白字符(包括\n,\t,\r,空格)
\w - 表示匹配是a-z,A-Z以及数字和下划线
\W - 表示和\w相反

  • 号表示前一个字符匹配0次或者无限次
  • 号表示前一个字符匹配一次或者无限次

正则表达式小案例:
1.验证手机号

import re 
text='13166892143'
result=re.match('1[34587]\d{9}',text)
print(result.group())

手机号必须第一步,第二位数字是34578,剩下9位随意匹配。

2.验证身份证号

import re
text='220122199605197535'
result=re.match('\d{17}[\d|x|X]',text)
print(result.group())
#有一些不严谨,在这里当作举例子用

接下来进入到我们今天正则表达式的案例,爬取58同城长春的租房信息
首先我们找到url,然后找到headers,cookie,思想还是遵循前面的案例想法,但是为了避免重复我们只爬取标题,这样就不用进入到详情页面了。
在这里插入图片描述

import requests
import re
import time

def parse_url(page_url):
    headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36',
             'cookie': 'f=n; commontopbar_new_city_info=319%7C%E9%95%BF%E6%98%A5%7Ccc; time_create=1651833783126; userid360_xml=5073453BC3F3378103306C5DD6313438; id58=CocNFmJMOjoRG6UpINqoAg==; 58tj_uuid=5f522b57-b5db-4c1e-91ad-dfaed5c54613; wmda_uuid=54945059623630baccf9ce2d19024bac; wmda_new_uuid=1; als=0; xxzl_deviceid=xZ3mzvUzZb7MfhlyfMjWDI43qItjOZEkCkzdMGVensviE4ufnO3TcSmfwuhOkOHN; 58home=cc; fzq_h=3668e23feed5ff34f5121533cacf4d11_1649165482837_aafa871639e1455faddcea1b2dcf0d7d_3688452105; aQQ_ajkguid=6909E4DE-8AC0-44AB-AAFD-564594183E03; sessid=29D9E48F-B91B-4704-B93F-802F0D536267; ajk-appVersion=; ctid=1; wmda_visited_projects=%3B2385390625025%3B11187958619315%3B1732038237441%3B10104579731767; xxzl_smartid=5258ec92b30a083b9c24b7abe6264f22; city=cc; xxzl_cid=2ac14936668549eba3f2d1267e499d31; xzuid=4b6daf1b-8235-4524-8294-5fadcc7a622c; f=n; commontopbar_new_city_info=319%7C%E9%95%BF%E6%98%A5%7Ccc; new_uv=3; utm_source=; spm=; init_refer=https%253A%252F%252Fcc.ganji.com%252F; wmda_session_id_2385390625025=1649241775503-9c4d1068-5b20-9030; commontopbar_ipcity=cc%7C%E9%95%BF%E6%98%A5%7C0; BAIDU_SSP_lcr=https://cc.ganji.com/; wmda_session_id_11187958619315=1649241776620-b94e118e-74a3-f619; new_session=0; wmda_session_id_10104579731767=1649242260725-d1698ea5-3e31-69e3; crmvip=; dk_cookie=; PPU=UID=50008179919636&UN=257yg0ij5&TT=85b0ddff390e2ad1cf9197b62a43bab6&PBODY=BtmW68AazGVFi-8GfV47Vx-GOH6uoejYuGjh242TlAQsKHxfn1ESmJKILSjwsl1eGTKKujjhFXG7bcNstnACkx6zImJtTYqABCmtaElOgYoYTqGN0qPRlsoWi1jNzJ-Te9xmrgFLIe2PNMQpN717DBCX7sZBka6WllSCVoaFwhE&VER=1&CUID=-PPNBXDEohf4g5_5jbNtDg; www58com=UserID=50008179919636&UserName=257yg0ij5; 58cooper=userid=50008179919636&username=257yg0ij5; 58uname=257yg0ij5; passportAccount=atype=0&bstate=0'}
#在这里我们找到了页面的headers和cookie
    proxy={'http':'http://120.220.220.95:8085'}
    resp=requests.get(page_url,headers=headers,proxies=proxy)
    #在这里我们换了一下ip,也相当于复习一下之前的知识
    text=resp.text
    houses=re.findall(r"""
        <div.+?des.+?<a.+?strongbox.+?>(.+?)</a> 
    """,text,re.VERBOSE|re.DOTALL)#获取房子的标题
    #从上面的图中我们看到属于该标题的标签,然后我们从div属性为list-box标签开始匹配,.+?属于匹配中间任意字符(.+?)就是我们需要的东西,加上re.DOTALL参数后,就是真正的所有字符。使用re.VERBOSE来编写注释,使用re.IGNRECASE来忽略大小写
    for house in houses:
        print(house)
        time.sleep(2)
      #这样我们就可以把标题进行提取下来了
def main():
    base_url='https://cc.58.com/chuzu/pn{}/?PGTID=0d3090a7-0013-f36b-4062-dd5eb66bbf85&ClickID=2'
    for x in range(1,11):
        page_url=base_url.format(x)
        parse_url(page_url)
   #base_url就是网页的规律,然后我们准备爬取10页的数据,进行爬取
if __name__ == "__main__":
    main()

同样我们也可以对其进行详情页面进行数据提取,就是在上面的函数中获取到详情页面的url,然后在提取详情信息。我们把主体框架写出来,各位有需求的可以在这个基础上继续提取。

<div.+?des.+?<a.+?="(.+?)".+?ass.+?strongbox.+?>.+?</a> 

这里我们写了一下提取详情页面的url,写的比较草率,但是可以提取到。谢谢各位大佬的观看!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫数据提取-正则表达式re提取网页数据信息 的相关文章

  • Python RAD(桌面部署)[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果这个问题回答了这么多次 请原谅我
  • Tastypie 与 application/x-www-form-urlencoded

    我有点难以弄清楚下一步应该做什么 我正在使用 tastypie 为我的 Web 应用程序创建 API 从另一个应用程序 特别是 ifbyphone com 我收到一个没有标题的 POST 如下所示 post data http myapp
  • 使用天蓝色错误“找不到资源”进行情绪分析

    我创建了一个 python 程序 它接受字符串作为输入并对其执行情感分析 我已经按照文档中所述创建了环境变量 并重新启动了 cmd 和 Visual Studio 但仍然出现以下错误 遇到异常 操作返回无效状态代码 未找到资源 python
  • Python - 定义常量列表或字典的最佳/最简洁的方法

    第一次使用堆栈溢出 我很高兴来到这里 简介 我最近开始了 Python 编程世界的神奇冒险 我喜欢它 现在 在我从 C 语言的尴尬过渡中 一切都进展顺利 但我在创建与标头文件 h 同义的内容时遇到了麻烦 问题 我有中等大小的字典和列表 大约
  • 无法使用 beautifulsoup 模块 python 从 HTML 检索温度值

    我正在使用 BeautifulSoup4 来解析此 HTML 查看源代码 https weather com en IN weather today l 17 39 78 49 https weather com en IN weather
  • 我无法使用 Python 和 Facebook Marketing API 获取所有 Facebook 营销活动的统计信息

    我正在尝试检索以下指标 date campaign name impressions clicks spend 在我的 Facebook 帐户中的所有活动中 但显然我编写的脚本仅返回某些活动的统计数据 而不是全部 它仅返回大多数营销活动的营
  • 使用opencv+picamera流IO用树莓派捕获视频

    我使用 Raspberry 来简单地显示一个视频 目前仅此 为此 我必须使用 opencv cv2 我尝试了很多解决方案 但现在我想使用 Picamera 库捕获视频 我将向您展示我的代码 import io import time imp
  • 在 PyCharm 中运行命令行命令

    你好 我正在使用Python 但之前从未真正使用过它 我收到一些命令 需要在终端中运行 基本上 python Test py GET feeds 我正在使用 PyCharm 我想知道是否有办法从该 IDE 中运行这些相同的命令 按 Alt
  • Python:动态向对象添加字段

    我想知道是否可以动态向对象添加字段 例如 我希望能够添加如下内容 user object user first name John user last name Smith 当我在 Python 命令行解释器中执行该命令时 我得到 Attr
  • 使用 shell=True 将 PATH 设置为 bitbake 的“source”在 Python 中没有效果

    下面是shell脚本中的代码 source proj common tools repo etc profile d repo sh repo project init branch repo project sync source pok
  • 替换 pandas 数据框中的点

    我有一个如图所示的数据框 数字实际上是对象 正在做df treasury rate pd to numeric df treasury rate 可预见的炸弹 然而 做df replace np nan 似乎没有摆脱这个点 所以我很困惑 有
  • 将 Python 控制台集成到 GUI C++ 应用程序中

    I m going to add a python console widget into a C GUI below some other controls 许多类将暴露给 python 代码 包括一些对 GUI 的访问 也许我会考虑 P
  • 计算二维笛卡尔坐标中不规则形状的边界

    我正在寻找一种计算不规则形状边界的解决方案 Lats take a look at Square example 如果我有Minimum x and y and Maximum x and y like MaxX 5 MinX 1 MaxY
  • 如何在 scikit-learn 的 SVM 中使用非整数字符串标签? Python

    Scikit learn 具有相当用户友好的用于机器学习的 python 模块 我正在尝试训练用于自然语言处理 NLP 的 SVM 标记器 其中我的标签和输入数据是单词和注释 例如 词性标记 而不是使用双精度 整数数据作为输入元组 1 2
  • Mac 上的 Errno 13 权限被拒绝

    我只是测试如何从一个 py 文件调用外部 py 文件 我有 2 个 py 文件 都在同一目录中 这是主要代码 runext py 假设调用 ext py import subprocess subprocess call Users tra
  • 使用 Matplotlib、PyQt 和 Threading 进行实时绘图导致 python 崩溃

    我一直在努力研究我的 Python 应用程序 但找不到任何答案 我有 PyQT GUI 应用程序 它使用 Matplotlib 小部件 GUI 启动一个新线程来处理 mpl 小部件的绘图 恐怕我现在通过从另一个线程访问 matplotlib
  • wxPython:更新wx.ListBox列表

    我在 python 程序中有一个 wx ListBox 我不想在 wx Timer 更新时更改其中的列表 我的计时器正在工作 我只是不知道如何更改它显示的列表 这是一个例子 http www daniweb com code snippet
  • Celery 设计帮助:如何防止并发执行任务

    我对 Celery AMQP 相当陌生 正在尝试提出一个任务 队列 工作人员设计来满足以下要求 我有多种类型的 每用户 任务 例如 TaskA TaskB TaskC 这些 每用户 任务中的每一个都为系统中的一个特定用户读取 写入数据 因此
  • Python:如何使用生成器来避免 sql 内存问题

    我有以下方法来访问 mysql 数据库 并且查询在服务器中执行 我无权更改有关增加内存的任何内容 我对生成器很陌生 并开始阅读更多有关它的内容 并认为我可以将其转换为使用生成器 def getUNames self globalUserQu
  • Scrapy - 持续从数据库中获取要爬取的url

    我想不断地从数据库中获取要爬行的网址 到目前为止 我成功地从基地获取了 url 但我希望我的蜘蛛继续从该基地读取 因为该表将由另一个线程填充 我有一个管道 一旦爬行 工作 就会从表中删除 url 换句话说 我想使用我的数据库作为队列 我尝试

随机推荐

  • js中(...)用法

    1 深拷贝一个对象 如上图所示 obj和tmp是完全两个独立的对象 互不影响 2 数组复制 3 函数形参中的使用 这里的 args 是对test函数中多余的参数进行收集 并转换成数组的形式进入函数体中 4 一种特殊情况 当数组里面套对象的时
  • sql 时间函数(全)

    Cite http www jb51 net article 20832 htm 1 当前系统日期 时间 select getdate 2 dateadd 在向指定日期加上一段时间的基础上 返回新的 datetime 值 例如 向日期加上2
  • C++结构体对齐问题

    规则1 结构体成员的内部偏移量 内部地址 要被这个成员的数据类型大小整除 规则2 整个结构体的大小 必须是最大成员的size整数倍 否则就需要在末尾补充空白字节 规则3 对于结构体中的结构体 按照结构体展开之后的内存对齐来处理 规则4 人为
  • 余老师带你学习大数据框架全栈第十三章Hudi第一节核心技术

    1 前言 1 1为什么产生数据湖 数据量比较大 越来越不满足处理结构化的数据 比如说数仓 数仓就是处理结构化数据 什么是结构化数据 就是数据成数据库来的 传统型的数据库有 MySQL数据库 Oracle SQLserver 从这些库里面过来
  • TensorFlow基础(1)-中使用多个 Graph

    代码中有时候会遇到 with tf Graph as default 其实这个可以有也可以没有 可能是可以让自己的思路更加清楚吧 知道这里开始新建图了 tensorflow官方教程 翻译 简介 当我们训练一个模型时 通常的做法是用一个 Gr
  • 公开课机器学习笔记(13)支持向量机三 核函数

    2 2 核函数Kernel 2 2 1 特征空间的隐式映射 核函数 咱们首先给出核函数的来头 在上文中 我们已经了解到了SVM处理线性可分的情况 而对于非线性的情况 SVM 的处理方法是选择一个核函数 通过将数据映射到高维空间 来解决在原始
  • DCL详解

    一 什么是DCL问题 在Java中 DCL通常指的是Double Checked Locking 双重检查锁定 DCL是一种用于多线程环境下懒加载单例对象的技术 它的基本思路是在对象还未被实例化时 先通过一次判空 避免了每次获取对象时都需要
  • JavaScript 数组find() 方法

    定义和用法 find 方法返回通过测试 函数内判断 的数组的第一个元素的值 find 方法为数组中的每个元素都调用一次函数执行 当数组中的元素在测试条件时返回 true 时 find 返回符合条件的元素 之后的值不会再调用执行函数 如果没有
  • C++指针的用法/指针与引用的区别

    指针的简介 计算机程序本质上是对存储在内存中的数据进行的一系列操作 既然要对数据进行操作 首先要解决的第一个问题就是数据存储在什么地方 一般情况下我们通过int x 10 来定义一个变量 可以通过x来直接访问该变量存储的值 而指针提供了另外
  • 启动和关闭ADB服务(adb start-server和adb kill-server)

    经作者测试 模拟器在运行一段时间后 adb服务有可能 在Windows进程中可找到这个服务 该服务用来为模拟器或通过USB数据线连接的真机服务 会出现异常 这时需要重新对adb服务关闭和重启 当然 重启Eclipse可能会解决问题 但那比较
  • C语言

    1024G 嵌入式资源大放送 包括但不限于C C 单片机 Linux等 关注微信公众号 嵌入式大杂烩 回复1024 即可免费获取 函数指针有两种常用的用法 一种是作为结构体成员 关于函数指针作为结构体成员的用法可移步至上一篇 C语言笔记 函
  • javascript 对象的定义(JS中定义类的方式有很多种)

    javascript 对象的定义 2007 04 19 21 47 43 个人分类 JS javascr pt 对象的定义 JS中定义类的方式有很多种 1 工厂方式 function Car var car new Object ocar
  • 亲测!纯净不限速的驱动大师

    哈喽 大家好 最近又发现一个宝贝级的电脑驱动下载安装 360驱动大师 是不是有小伙伴要骂我了 先等等 等你看完小编的亲测结果 你就知道他的香了 一提到360呀 感觉大家对他的影响都不太好 因为在日常生活中它总会给我们带来莫名其妙的弹窗烦恼
  • 《数据挖掘导论》学习笔记-特征创建

    根据原有的属性我们可以创建出新的属性集 而且新的属性数目可能少于原有的属性数目 也就是降维 创建新的属性的方法有三种 特征提取 映射数据到新的空间 特征构造 1 特征提取 定义 根据原有的数据自己创建新的属性集 有的数据的属性是非常多的 而
  • 高频交易系统为何都是基于C++开发的?

    我开源过一个高频框架 说一下高频框架做的事 你就知道为什么要用C 了 高频并不是并发有多少 其实是追求的低延时 如果从网络协议开始优化 可以使用RDMA可编程网卡硬件 也可以使用DPDK这种网卡旁路技术 我们暂且不关注操作系统以下层面的优化
  • 【gmock】Google Mock 入门

    目录 1 概述 1 1 什么是Mock 1 2 Google Mock概述 1 3 参考文档 2 Google Mock使用 2 1 最简单的例子 2 2 典型的流程 2 3 自定义方法 成员函数的期望行为 2 4 Matcher 匹配器
  • Java EE之idea创建和运行jsp项目

    1 点击打开Inteliij点击Create New Project 2 点击java 再左侧Project SDK选择安装的jdk路径 勾选WebApplication和Create web xml 点击next 4 再新弹出的窗口中 P
  • java包装类自动拆装箱(AutoBoxing)及128陷阱详解

    java包装类自动拆装箱 AutoBoxing 及128陷阱详解 注意 java5之前拆装箱是需要手动完成的 java5之后可以自动的完成 1 装箱 装箱 把基本类型转成对象包装类型 方式一 Integer i Integer valueO
  • Unity3D学习之(习题练习)

    Unity3D学习之 习题拓展 1 使用continue计算1 3 5 99 从上述运算中可以看出 1到99之的奇数相加的和 首先要定义一个int sum 0 从题意可知要用到for循环 for int i 1 i lt 100 i 然后题
  • 爬虫数据提取-正则表达式re提取网页数据信息

    经过上一期我们介绍了xpath和beautifulsoup4提取数据之后 本章我们介绍一种新的提取数据的方法 就是正则表达是提取数据 首先我们介绍什么是正则表达式 正则表达式就是按照一定的规则 从某个字符串中匹配出想要的数据 这个规则就是正