Python网络爬虫MOOC听课笔记-第三周re库

2019-09-04

在MOOC上,学习了北京理工大学,嵩天老师的Python网络爬虫与信息提取,此为学习笔记记录,备查,备翻阅复习。

正则表达式介绍

requests

BeautifulSoup

re

正则表达式:用来简洁表达一组字符串的表达式。

正则表达式的语法

语法由字符和操作符组成。

常用操作符

.
[]
[^]
*
+
?
|
{m}
{m,n}
^
$
()
\d
\w

经典正则表达式实例

^[A-Za-z]+$ 由26个字母组成的字符串

^[A-Za-z0-9]+$ 由26个字母和数字组成的字符串

Re库的使用

是python 的标准库,不需要额外安装。

import re

re库使用raw string类型表示正则表达式,表示为r’text’

raw string类型是不包含转移符号的字符串。

re库也可以使用string类型,但是更繁琐,因为string中的反斜线会混淆正则表达式的反斜线。

主要功能函数6个

函数 说明
re.search() 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
re.match() 从一个字符串的开始位置起匹配正则表达式,返回match对象
re.findall() 搜索字符串,以列表类型返回全部能匹配的子串
re.split() 将一个字符串按照正则表达式匹配结果进行分割,返回子串的 列表类型
re.finditer() 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
re.sub() 在一个字符串中替换所有正则表达式的子串,返回替换后的字符串

Re库的另一种等价用法

上述是函数式用法。

面向对象用法:编译后的多次操作,regex = re.compile()

函数 用法
regex.search() 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象
regex.match() 从一个字符串的开始位置起汽配正则表达式,返回match对象
regex.findall() 搜索字符串,以列表类型返回全部能匹配的子串
regex.split() 将一个字符串按照正则表达式匹配结果进行分割,返回列表类型
regex.finditer() 搜索字符串,返回一个匹配结果的迭代类型,每个迭代元素是match对象
regex.sub() 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串

在上面这6个函数使用的时候,注意需要将函数参数中正则表达式的参数部分去掉,因为re.compile()已经给出了。

Re库的match对象

match对象主要有四个属性

  • .string

  • .re

  • .pos

  • .endpos

match对象的方法

  • .group(0) 获得匹配的字符串

  • .start() 匹配字符串在原始字符串的开始位置

  • .end()

  • .span()

Re库的贪婪匹配和最小匹配

Re库默认采用贪婪匹配,即输出匹配最长的子串。

最小匹配在贪婪匹配上进行扩展,最小匹配操作符

就是在操作符后加一个问号,来获得最小匹配的结果。

操作符 说明
*? 前一个字符0次或无限次扩展,最小匹配
+? 前一个字符1次或无限次扩展,最小匹配
?? 前一个字符0次或1次扩展,最小匹配
{m,n}? 扩展前一个字符m至n次(含n),最小匹配

实例 淘宝商品信息定向爬虫

功能描述

  • 目标 获取淘宝搜索页面的信息,提取其中的商品名称和价格
  • 理解 淘宝的搜索接口;翻页的处理
  • 技术路线 reqeusts re

淘宝搜索”书包”

程序的结构设计

步骤1 提交商品搜索请求,循环获取页面

步骤2 对于每个页面,提取商品名称和价格信息

步骤3 将信息输出到屏幕上。

实例 股票数据定向爬虫

目的 获取上交所和深交所的股票名称和价格

输出 保存到文件中

技术路线 requests-re-BeautifulSoup

候选网站 新浪股票和百度股票

选取网页原则: 股票信息是静态存放在html中,非js代码生成,没有robotx协议限制

选取方法 查看网页源代码

选取心态 不要纠结于某一个网站,多找信息源尝试

打开网页发现,新浪股票中某一个股票的价格在源代码中找不到,说明可能是js生成的。而百度股票可以。

程序的结构设计

1 从东方财富网获取股票列表

2 根据股票列表逐个到百度股票获取个股信息

3 将结果存储到文件