爬虫之网络数据解析的三种方式 您所在的位置:网站首页 正则表达式在网络爬虫中的作用 爬虫之网络数据解析的三种方式

爬虫之网络数据解析的三种方式

2023-08-22 14:05| 来源: 网络整理| 查看: 265

1、正则表达式

爬虫的四个主要步骤:

明确目标(要知道你准备取哪个范围或者网站上取搜索)爬(将所有网站的内容全部爬下来)取(取掉对我们没用的数据)处理数据(按照我们想要的方式存储和使用) 什么是正则表达式?

正则表达式(regular expression),又称为规则表达式,描述了一种字符串匹配的模式(pattern),通常被用来检索、替换那些符合某个模式(规则)的文本。

正则表达式是由普通字符(例如字符a到z)+ 特殊字符(称为“元字符”)组成的文字模式。

正则表达式被广泛的集成到各种文本编辑器/文本处理工具当中

应用场景 验证: 表单提交时,进行用户名密码的验证查找: 从大量信息中快速提取指定内容,在一批url中,查找指定的url,通常用于爬虫替换: 将指定格式的文本进行正则匹配查找,找到之后进行特定替换 基本要素 字符串数量限定符位置限定符预定义字符集 1、字符类 语法说明表达式实例完整匹配的字符串一般字符匹配自身abcabc.匹配任意除了换行符"\n"外的字符a.cabc\转义字符,使后一个字符改变原来的意思a.ca.c[…]匹配[ ]内任一字符。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。如果第一个字符是^则表示取反,如[^abc]表示不是abc的其他字符。a[bcd]eabe、ace、ade-在[ ]内表示字符范围wo[a-c]ldwoald、wocld 2、数量限定符 字符含义举例匹配的字符串*匹配前一个字符0次或者无限次abc*ab、abccccc?匹配前一个字符0次或1次abc?ab、abc+匹配前一个字符1次或者无限次abc+abc、abcccc{m}匹配前一个字符m次ab{2}cabbc{m,n}匹配前一个字符m至n次。m和n可以省略:若省略m,则匹配0至n次;若省略n,则至少匹配m次。ab{1,2}cabc、abbc 3、位置限定符

在这里插入图片描述

4、预定义字符集

在这里插入图片描述

5、逻辑、分组

在这里插入图片描述

re模块一般使用步骤 使用 compile() 函数将正则表达式的字符串形式编译为一个 Pattern 对象通过 Pattern 对象对文本进行匹配查找,获得匹配结果,一个 Match 对象。使用 Match 对象提供的属性和方法获得信息,根据需要进行其他的操作

在这里插入图片描述 正则表达式实现步骤:

# 1.使用compile()函数将正则表达式的字符串形式编译为一个Pattern对象 # 注意:re对特殊字符进行转义, 如果使用原始字符串,只需加一个r前缀 import re text = "2020-12-12 2019-5-3 2020/10/10" pattern = re.compile(r'(?P\d{4})-(?P\d{2})-(?P\d{2})') # 命名分组 # 2.通过Pattern对象对文本进行匹配查找,获得匹配结果,一个Match对象 # search从给定的字符串中寻找一个符合规则的字符串,返回回来一个 result = re.search(pattern, text) print(result) # 3.使用Match对象提供的属性和方法获取信息,根据需要进行操作 print(result.group()) # 返回的是匹配到的文本信息 2020-12-12 print(result.groups()) # 返回的是位置分组信息 ('2020', '12', '12') print(result.groupdict()) #返回的是关键字分组信息 {'year': '2020', 'month': '12', 'day': '12'} Pattern对象

正则表达式编译成 Pattern 对象, 可以利用 pattern 的一系列方法对文本进行匹配查找了。 在这里插入图片描述

Pattern 对象的一些常用方法主要有:

match 方法:从起始位置开始查找,一次匹配search 方法:从任何位置开始查找,一次匹配findall 方法:全部匹配,返回列表finditer 方法:全部匹配,返回迭代器split 方法:分割字符串,返回列表sub 方法:替换 match方法

match 方法用于查找字符串的头部(也可以指定起始位置),它是一次匹配,只要找到了一个匹配的结果就返回, 而不是查找所有匹配的结果。它的一般使用形式如下: 在这里插入图片描述

string 待匹配的字符串pos 字符串的起始位置, 默认值是 0endpos 字符串的终点位置, 默认值是 len (字符串长度) re模块常量

常量即表示不可更改的变量,一般用于做标记。下图是常用的四个模块常量: 在这里插入图片描述

Match对象 group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;span([group]) 方法返回 (start(group), end(group))。 search方法

search 方法用于查找字符串的任何位置,它也是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有 匹配的结果,它的一般使用形式如下: 在这里插入图片描述 当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None。

findall方法与finditer方法

findall 方法搜索整个字符串,获得所有匹配的结果。使用形式如下:

在这里插入图片描述 finditer 方法的行为跟 findall 的行为类似,也是搜索整个字符串,获得所有匹配的结果。但它返回一个顺序访问每 一个匹配结果(Match 对象)的迭代器。

split方法

split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下: 在这里插入图片描述

maxsplit 指定最大分割次数,不指定将全部分割 sub方法

sub 方法用于替换。它的使用形式如下:

在这里插入图片描述

repl 可以是字符串也可以是一个函数:    1). 如果 repl 是字符串,则会使用 repl 去替换字符串每一个匹配的子串,并返回替换后的字符串,另外,repl 还 可以使用 id 的形式来引用分组,但不能使用编号 0;    2). 如果 repl 是函数,这个方法应当只接受一个参数(Match 对象),并返回一个字符串用于替换(返回的字符 串中不能再引用分组)。count 用于指定最多替换次数,不指定时全部替换。

正则split和sub方法:

import re text = "1+2-3*4-5/5" # ************split************** pattern = re.compile(r'\+|-|\*|/') result = re.split(pattern, text) print(result) # *************sub********** def repl_string(matchObj): items = matchObj.groups() print(items) return '-'.join(items) text = '2010/10/10 2020/12/12 2010-5-3' pattern = re.compile(r'(\d{4})/(\d{1,2})/(\d{1,2})') result = re.sub(pattern,repl_string, text) print(result) ['1', '2', '3', '4', '5', '5'] ('2010', '10', '10') ('2020', '12', '12') 2010-10-10 2020-12-12 2010-5-3 贪婪模式和非贪婪模式 贪婪模式:在整个表达式匹配成功的前提下,尽可能多的匹配 ( * ); 使用贪婪的数量词的正则表达式 ab* ,匹配结果: abbb。* 决定了尽可能多匹配 b,所以a后面所有的 b 都出现了。非贪婪模式:在整个表达式匹配成功的前提下,尽可能少的匹配 ( ? ); 使用非贪婪的数量词的正则表达式 ab*? ,匹配结果: a。 即使前面有 * ,但是 ? 决定了尽可能少匹配 b,所以没有 b。Python里数量词默认是贪婪的。

基于requests和正则的猫眼电影TOP100定向爬虫: 项目介绍: 应用requests库和正则表达式来抓取猫眼电影TOP100的电影名称、时间、评分、图片等信息。

项目分析: 1. 需求分析,明确采集的网址。 https://maoyan.com/board 2. 爬, requests数据采集库 3. 取,正则表达式数据解析库 4. 存, json格式存储到文件

import codecs import json import re import time from urllib.error import HTTPError import requests from colorama import Fore from fake_useragent import UserAgent def down_page(url): try: ua = UserAgent() headers = { 'User-Agent':ua.random, 'Cookie':'__mta=49747353.1586608791319.1586618569026.1586618581654.11; uuid_n_v=v1; uuid=73354BA07BAE11EA81AF6B12644ABFB70CD0E584BFFF4456AE4AA96286336568; _csrf=1d3978fad0d68febffd13896596effb6fa9633349bd601af3678a1bcd78c47b9; Hm_lvt_703e94591e87be68cc8da0da7cbd0be2=1586608791,1586609306; Hm_lpvt_703e94591e87be68cc8da0da7cbd0be2=1586618649; _lxsdk_cuid=1716940dec2c8-018cbd125127c58-3e6e4647-100200-1716940dec2c8; _lxsdk=73354BA07BAE11EA81AF6B12644ABFB70CD0E584BFFF4456AE4AA96286336568; mojo-uuid=1a2bc23bad16f412c35c00f9b881946a; __mta=49747353.1586608791319.1586618086296.1586618566417.10; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; _lxsdk_s=17169b3dce9-5ef-6b5-ccd%7C%7C28; mojo-trace-id=20; mojo-session-id={"id":"05adcf6f220fcf28a22a52d7640319db","time":1586616327477}', 'Host':'maoyan.com', } response = requests.get(url, headers=headers) except HTTPError as e: print(Fore.RED + '[-] 爬取网页%s失败:%s' %(url, e.reason)) return None else: return response.text def parse_html(html): """通过正则表达式对html解析获取电影名称、时间、排行、图片等信息""" pattern = re.compile( '' + '.*?(\d+)' # 1 + '.*?


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有