爬虫 之 正则表达式学习

1.正则表达式

下面先给出一个简单的示例:
在这里插入图片描述
^ 为匹配输入字符串的开始位置。
[0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个。
abc$匹配字母 abc 并以 abc 结尾,$ 为匹配输入字符串的结束位置。
re 模块使 Python 语言拥有全部的正则表达式功能。

(1)re.match函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。

# 语法:re.match(pattern, string, flags=0)
import re
print(re.match('www', 'www.runoob.com').span())  # 在起始位置匹配
print(re.match('com', 'www.runoob.com'))         # 不在起始位置匹配

(2)re.search方法

re.search 扫描整个字符串并返回第一个成功的匹配。

re.search(pattern, string, flags=0)

re.match与re.search的区别:
re.match只匹配字符串的开始,而re.search匹配整个字符串,直到找到一个匹配。
在这里插入图片描述

2. 检索和替换

Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。

re.sub(pattern, repl, string, count=0, flags=0)

参数:

  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。
  • count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
    在这里插入图片描述
    re.compile 函数:
    compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。 语法格式为:
re.compile(pattern[, flags])

在这里插入图片描述

3.结合requests、re两者的内容爬取豆瓣电影 Top 250里的内容

要求:抓取名次、影片名称、国家、导演等字段。

import requests # 导入requests库
import re # 导入正则表达式
import time

def loadPage(url):
    '''
    访问目标地址,并返回网页源代码

    '''
    response = requests.get(url=url).content # 访问目标网址
    response = str(response, 'utf-8')
    return response

def match(rule, html):
    '''
    利用正则表达式从源代码中匹配想要获取的内容
    '''
    result = re.findall(rule,html)
    return result
def dataSave(datas):
    '''
    将获得的数据写入txt文档
    '''
    for data in datas:
        with open("豆瓣Top250.txt", 'a', encoding='utf-8') as f:
            f.write(data)
def main():
    '''
        250个电影,一页显示25个,总共10页,即url地址start=后累加9次
    '''
    # 添加浏览器用户代理
    # hearders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
    #                   "Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"
    # }
    url = "https://movie.douban.com/top250?start=" # 豆瓣top250网址,strart=后面加页数,比如第一页就是0,第二页是25,每次累加25
    rules = r'<div class="hd">([\d\D]*)</li>' # 正则表达式匹配电影信息
    for i in range(10):
        whole_url = url + str(i*25)
        print("正在获取第%d页" %(i+1))
        content = loadPage(whole_url) # 获取每一页的内容
        datas = match(rules, content)  # 获取电影内容
        dataSave(datas)  # 将数据写入文件
        time.sleep(3) # 每获取一页等3s后再获取下一页
if __name__ == '__main__':
    main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值