当前位置:首页>python>简单python爬虫代码(正则模块)

简单python爬虫代码(正则模块)

  • 2026-09-05 03:34:46
简单python爬虫代码(正则模块)
re模块
  • Python 的 re 模块是用于处理正则表达式的标准库模块。
  • 正则表达式可以用于用于匹配、搜索和操作文本。
  • 通过 re 模块,可以在 Python 中使用正则表达式来处理字符串。
为什么使用 re 模块?
处理文本时,我们经常要搜寻特定格式内容、替换字符,像校验邮箱、提取网页链接、整理文本都属于这类场景。手动编写代码实现会十分麻烦,正则表达式就能简洁高效地完成这类工作。
以下是一些常用的正则表达式:
\w
匹配除换行符以外的任意字符
\s
匹配任意空白符
\d
匹配数字
\n
匹配换行符
\t
匹配制表符
^
匹配字符串的开始
$
匹配字符串的结束
\W
表示除[0-9a-zA-Z_]之外的字符
\S
表示一个非空白字符
\D
表示非数字
|
或
( )
匹配括号内的表达式,也可以表示一个组
[ ]
匹配字符组中的字符
[^ ]
匹配非字符组中的字符
*
重复零次或更多次
+
重复一次或更多次
?
重复零次或一次
{n}
重复n次
{n, }
重复n次或更多次
{n,m}
重复n次或m次
贪婪匹配
.*
尽可能多地匹配内容
惰性匹配
.*?
尽可能少地匹配内容
下面我们来看一段代码:
import relst = re.findall(r"\d+", "my munber is 10086,my friend number is 10010")print(lst)it =re.finditer(r"\d+", "my munber is 10086,my friend number is 10010")print(it)for i in it:    print(i.group())s = re.search(r"\d+", "my munber is 10086,my friend number is 10010")print(s.group())s = re.match(r"\d+", "10086,10010")print(s.group())obj = re.compile(r"\d+")ret = obj.finditer("my number is 10086,my girlfriend number is 10010")print(ret)for i in ret:    print(i.group())    s = """    <div class='jay'><span id='1'>郭麒麟</span></div>               <div class='jj'><span id='2'>宋轶</span></div>               <div class='jolin'><span id='3'>大聪明</span></div>               <div class='tory'><span id='4'>范思哲</span></div>               <div class='tory'><span id='5'>胡说八道</span></div>    """obj = re.compile(r"<div class='.*?'><span id='.*?'>(?P<name>.*?)</span></div>",re.S)result = obj.finditer(s)for it in result:    print(it.group("name"))

下面我们来解释一下代码:
import re
导入正则表达式模块,Python 正则全部依靠 re。
lst = re.findall(r"\d+", "my munber is 10086,my friend number is 10010")
  • re.findall(正则, 字符串)\d+
  • 匹配连续数字(1 个及以上数字)
  • 作用:找到字符串中所有匹配内容,直接封装成列表返回
it = re.finditer(r"\d+", "my munber is 10086,my friend number is 10010")
  • re.finditer(正则,字符串)
  • 找到所有匹配项,返回迭代器,不是直接返回文本。迭代器里面存放的是匹配对象。
for i in it:    print(i.group())
  • 遍历迭代器,i 是匹配对象;
  • .group():取出本次匹配到的字符串内容。
s = re.search(r"\d+", "my munber is 10086,my friend number is 10010")
  • re.search():在整个字符串里找到第一个匹配内容,返回匹配对象。找到第一个就停止向后查找。
s = re.match(r"\d+", "10086,10010")
  • re.match()只从字符串开头进行匹配!
  • 字符串开头是数字 10086,匹配成功。
obj = re.compile(r"\d+")
  • re.compile():预编译正则表达式把正则模板提前编译成对象,适合一段正则反复多次使用,提升运行效率。
ret = obj.finditer("my number is 10086,my girlfriend number is 10010")
  • 使用编译好的正则对象调用 finditer,效果等价 re.finditer(r"\d+",文本)
s = """    <div class='jay'><span id='1'>..."""
多行 HTML 文本字符串,用来模拟网页源码。
obj = re.compile(r"<div class='.*?'><span id='.*?'>(?P<name>.*?)</span></div>",re.S)
  • .*?:非贪婪匹配(尽可能少匹配内容)
  • (?P<name>.*?):命名分组,给分组起名字 name,方便后续通过名字取值
  • re.S 等价 re.DOTALL:让 . 可以匹配换行符,否则无法跨行匹配
for it in result:    print(it.group("name"))
  • .group("name"):根据分组名称,直接取出命名分组内捕获到的文本 
  • 依次输出:郭麒麟、宋轶、大聪明、范思哲、胡说八道

接下来我们来尝试爬取一下豆瓣的榜单:
1. 我们可以在浏览器看到豆瓣的喜剧篇的排行榜,但是地址栏中的url并不是我们爬取的目标地址(不信可以试试),需要我们在浏览器中按下F12,找到网络,点击Fetch/XHR,可以看到里面并没有内容,我们现在按下ctrl+r,或者点击重新加载页面,因为我们在打开网页的时候浏览器并没有记录网络活动。
2. 现在我们可以看到有两条记录,因为(懒)第二条中包含了榜单上的信息,所以我们点击第二条,可以看到在响应中确实包含了榜单中的信息。
3. 我们再点击标头,可以看到我们真正的目标url是:
https://movie.douban.com/j/chart/top_list
4. 接下来我们就可以开始写代码了:
import requestsimport repage = 20url = "https://movie.douban.com/j/chart/top_list"for page in range(20,101,20):  headers = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0"}  param = {            "type": "24",            "interval_id": "100:90",            "action": "",            "start": "20",            "limit": str(page)  }resp = requests.get(url,headers=headers,params=param)obj = re.compile(r'"title"\s*:\s*"(?P<title>.*?)"', re.S)res = obj.finditer(resp.text)for it in res:  print(it.group("title"))
由于篇幅限制(懒),就不一步一步写代码了。接下来解释一下以上代码:
for page in range(20,101,20):
range(起始,终止,步长)循环取值:20、40、60、80、100
param = {    "type": "24",    "interval_id": "100:90",    "action": "",    "start": "20",    "limit": str(page)}
params 就是 URL 拼接的查询参数:
  • start:从第几条数据开始加载
  • limit:本次最多返回多少条数据
  • type、interval_id 是榜单筛选条件
resp = requests.get(url, headers=headers, params=param)
发起 GET 请求,自动把 param 字典拼接在 url 后面,拿到接口返回数据。
obj = re.compile(r'"title"\s*:\s*"(?P<title>.*?)"', re.S)
编译正则表达式:
  • "title":匹配字符串 
  • "title"\s*:匹配任意数量空白(空格、制表符)
  • : :匹配冒号
  • (?P<title>.*?):命名分组,捕获电影名称,命名为 
  • title.*?:非贪婪匹配,防止一次性跨多条数据匹配
  • re.S:让 . 可以匹配换行
运行以上代码就能爬取到豆瓣喜剧榜单了。
注意:网络爬虫有风险,网站可能封IP,还请遵守法律规范,控制爬取频率,以上代码仅供python学习,禁止利用爬虫绕过限制,攻击网站。

最新文章

随机文章