《从零开始学习python网络爬虫》——07讲,re模块的使用

前言:

提起python内置re模块,就会想到正则表达式,本期给大家带来正则表达式的相关语法和内置方法的使用,还有两个使用re模块提取数据的案例,供大家参考。

 正则表达式:

元字符:

元字符
.匹配任意1个字符(除了\n)
[]匹配[]中列举的字符
\d匹配数字,0-9
\D匹配非数字
\s匹配空白,即空格,tab键,换行
\S匹配非空白,(数字、英文字符、特殊符号)
\w匹配单词字符,即a-z,A-Z,0-9
\W匹配非单词字符
*匹配前一个字符出现0次或者无限次,即可有可无
+匹配前一个字符出现1次或者无限次,即至少有1次

 re模块:

1.re.match

match()用于查找字符串的头部,它是一次匹配,只要找到了一个匹配结果就返回,而不是所有匹配的结果,形式如下:

match(pattern, string[  ,  flag])

import re

pattern='python'

string='pythonhhhjjsajidgpythonasdjjsk'

result=re.match(pattern,string)

print(result)


#<re.Match object; span=(0, 6), match='python'>匹配的结果

其中pattern是正则规则字符串,string是待匹配的字符串,flag是可选参数,

当匹配成功时返回一个match对象,如果没有,则返回None。

2.re.search

search()用于查找字符串的任何位置,它也是一次匹配,只要找到一个结果就返回,而不是查找所有匹配的结果,它的形式如下:

search(pattern,   string[  ,  flag])

#导入模块
import re

str='one12two2three3'

result=re.search('\d+',str)

print(result)
#search()函数用来查找第一个出现匹配的下标,返回一个正则对象

print(result.group())

#用group()函数用来返回之前抽出来的值


"""
<re.Match object; span=(3, 5), match='12'>
12
"""

匹配成功时返回一个match对象,如果没有匹配上,则返回None。

3.re.findall

上述两种方法都是一次匹配,大多数时候,我们需要搜索整个字符串,获得所有匹配的结果。findall形式如下:

findall(pattern, string, [ ,flag])

import re

str='one1two2three3'

result=re.findall('\d+',str)
print(result)

result=re.findall('\D+',str)
print(result)

#d是数字,D是英文,返回一个列表
"""
['1', '2', '3']
['one', 'two', 'three']
"""

findall()以列表形式返回全部匹配的子串,如果没有匹配,则返回一个空列表。

4.re.split 

split()能够将匹配的子串分割后返回列表,它的使用形式如下:

split(pattern , string [   ,maxsplit, flags])

import re

pattern='\d+'

string='pythonasdkjasd464654adhuiaghsdk564654akjsdhkashdkja'

result=re.split(pattern,  string ,maxsplit= 2)

print(result)


"""
['pythonasdkjasd', 'adhuiaghsdk', 'akjsdhkashdkja']

"""

这里的maxsplit默认为0表示全部切割,

1 代表切割1次

2 代表切割2次

 5.re.sub

sub()用于替换,使用形式如下:

sub(pattern , rep1, string[  ,  count,  flags])

第一个参数是正则表达式,第二个参数是要替换成的字符,第三个为原字符串,第四个参数为可选项,代表最多替换次数,默认为全部替换。

import re

phone='123-456-789'
new_phone=re.sub('\D','',phone)
print(new_phone)

#结果为:123456789
flags
re.I匹配对大小写不敏感
re.L做本地化识别匹配
re.M多行匹配,影响^和$
re.S使.匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B
re.X该标志通过给于更灵活的格式以便你将正则表达式写得更于理解

 案例一:提取双色球中奖信息

网页地址:https://sds.yiqicai.com/detail/1001/23108

提取中奖日期,全国销量,累计奖池,大奖号码。

import re
import time
import requests
import bs4
import random
from PreventSpider import headers_list
from bs4 import BeautifulSoup
#导入模块

def getData(your_url):

    #构建请求头
    headers={
        'User-Agent':random.choice(headers_list),
        'Host': 'sds.yiqicai.com',
        'Cookie': '6140d6b0ad9f4c98842cf49e8b7933c3 = WyIyNTY0MDkyNDY4Il0;Hm_lvt_5b67d7ffc244beea7a0e6dafd608d392 = 1695119057;Hm_lpvt_5b67d7ffc244beea7a0e6dafd608d392 = 1695119057',
    }

    #获取响应体对象
    response=requests.get(url=your_url,headers=headers)
    # print(response.text)

    honour_number=re.findall('</span> <b class="c-red" data-v-6697473c>(.*?)</b></dd>',response.text)[0]
    time=re.findall('aq,issueDay:"(.*?)",issueWeek:m,resultTime',response.text)[0]
   
    jiangchi=re.findall('累计奖池:</span> <b class="c-red" data-v-6697473c>(.*?)</b>',response.text)[0]
    first=re.findall('<em data-v-6697473c>(.*?)</em>',response.text)


    print('本期开奖时间:',time)
    print('本期奖池为销量为:',honour_number,'注')
    print('累计奖池:',jiangchi,'元')
    print('本期一等奖为:',end=' ')
    #输出大奖号码
    for f in first:
        print(f,end=' ')


if __name__=='__main__':
    getData('https://sds.yiqicai.com/detail/1001/23108?frm=C_PC360')

 

案例二:提取斗破苍穹小说

网址:第五回 治伤(2)_笑傲江湖_无忧书城

提取该文章信息:

import re
import requests
import random
from PreventSpider import headers_list
import time

f=open('D:\python爬虫\爬虫新手课程\data.txt','a+')
def getData(your_url):
    headers={
        'User-Agent':random.choice(headers_list)
    }

    response=requests.get(url=your_url,headers=headers)
    #检测网页状态码
    if (response.status_code == 200):
        #print(response.text)
        #匹配文章
        contents=re.findall('<p>(.*?)</p>',response.text,re.S)
        for content in contents:
            #将非截断空白替换为空
            item=content.replace('&nbsp;','')
            # f.write(item)
            """
            字符串有些无法输入,需要改代码,如下:
            """
            print(item)
            #写入文件
            f.write(item.encode('gbk','ignore').decode('gbk'))


if __name__=='__main__':
    #提取一百页数据
    for page in range(100):
        urls=[f'https://www.51shucheng.net/wangluo/doupocangqiong/{page}.html']
        for url in urls:
            try:
                getData(url)
                time.sleep(1)
            except 'page' as e:
                pass
f.close()

回到所创建的txt文件查看所爬取的文章信息,可惜的是有些文字做了字体反扒,后续需要进行字体反扒的破解,后面文章再发布破解思路。

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
学习Python网络爬虫可以分为以下几个步骤: 1. 学习Python基础知识:掌握Python的基本语法、变量、数据类型、函数、模块、文件操作等知识。 2. 学习HTTP协议和HTML语言:了解HTTP协议和HTML语言的基本知识,包括HTTP请求和响应、HTML标签和结构等。 3. 学习爬虫框架和库:学习使用Python中的爬虫框架和库,如requests、Beautiful Soup、Scrapy等。 4. 爬取网页数据:通过爬虫框架和库,编写Python脚本实现爬取网页数据的功能,如获取网页源代码、解析HTML结构、提取数据等。 5. 存储和处理数据:将爬取到的数据存储到本地文件或数据库中,并进行数据处理和分析。 以下是具体的学习步骤: Step 1:学习Python基础知识 推荐学习资料:《Python编程快速上手》、《Python基础教程》等。 Step 2:学习HTTP协议和HTML语言 推荐学习资料:《图解HTTP》、《HTML和CSS设计和构建网站》等。 Step 3:学习爬虫框架和库 推荐学习资料:官方文档、《Python爬虫开发与项目实战》等。 Step 4:爬取网页数据 以爬取豆瓣电影Top250为例,以下是一个简单的Python爬虫: ```python import requests from bs4 import BeautifulSoup url = 'https://movie.douban.com/top250' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') movies = soup.find_all('div', class_='hd') for movie in movies: print(movie.a.span.text) ``` 该爬虫使用requests库发送HTTP请求,使用Beautiful Soup库解析HTML结构,获取豆瓣电影Top250的电影名。 Step 5:存储和处理数据 可使用Python内置的文件操作函数或第三方库如pandas、numpy等对爬取到的数据进行存储和处理。 以上是从零开始学习Python网络爬虫的基本步骤,希望对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烧酒调调

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值