您现在的位置是:首页 >技术交流 >Python爬虫经典战役——正则实战网站首页技术交流

Python爬虫经典战役——正则实战

朦胧的雨梦 2024-06-17 10:14:45
简介Python爬虫经典战役——正则实战

本文概要

本篇文章主要介绍利用Python爬虫爬取某瓣电影信息,适合练习爬虫基础的同学,文中描述和代码示例很详细,干货满满,感兴趣的小伙伴快来一起学习吧!
在这里插入图片描述

???个人简介???

☀️大家好!我是新人小白博主朦胧的雨梦,希望大家多多关照和支持???
?大家一起努力,共同成长,相信我们都会遇到更好的自己???
?期待我的文章能给各位带来收获和解决问题的灵感???
?大家的三连是我不断更新的动力~???

在这里插入图片描述

本次爬虫思路

1. 获取url
2. 通过请求拿到响应
3. 处理反爬
4. 提取信息
5. 保存内容

本次操练网页

        https://movie.douban.com/top250<某瓣电影信息>
在这里插入图片描述

网页内容:

在这里插入图片描述

学习目标?

  1.了解正则表达式的书写;

  2.掌握网页页面结构;

  3.掌握如何利用正则表达式提取内容。

✨一.模板

?1.urllib库的使用模板

import urllib.request     
url ='xxxxxxxxxxxx'   
# 发送请求                
request= urllib.request.Request(url,data,header)      
# 得到响应
response=urllib.request.urlopen(request)
# 解码
content = response.read().decode() 
# 查看数据
print(content)    

?2.requests库的使用模板

import requests   
url ='xxxxxxxxxxxx' 
# 发送请求                              
response = request.get(url, params,headers)  (get请求或者post请求)  
# 根据响应的格式解码,非常智能
response.encoding=response.appareent_encoding
# 查看数据
print(response.txt)

✨二.分析信息接口

  右键查看网页源代码

在这里插入图片描述

  很明显,爬取的信息就在源代码里,熟悉的结构熟悉的配方,这里直接对网页链接发起请求,从而得到它的网页源码。

✨三.通过请求拿到响应

import requests

# 需要请求的url
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/106.0.0.0 Safari/537.36',
}

# 获得响应
response = requests.get(url=url, headers=headers)

# 智能解码
response.encoding = response.apparent_encoding
# 打印数据
print(response.text)

在这里插入图片描述
在这里插入图片描述

同理,这种网页结构就是最好的,它把所有信息都放在明面上(不偷摸搞事情),上一篇咱们重点学习了如何去使用XPath提取页面信息,本篇同样的结构,而侧重点在正则表达式,希望大家能提前掌握好文章的重心变化,话不多说,开干!

✨四. 提取信息

?正则表达式

  Python 自1.5版本起增加了re模块,它提供 Perl 风格的正则表达式模式。compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换

  compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数

  咱们主要介绍re.compile函数:
  compile函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用

函数参数作用
re.compile()pattern,flagscompile函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用

对于参数flags:可选,表示匹配模式。

参数作用
re.I忽略大小写
re.L表示特殊字符集, 依赖于当前环境
re.M多行模式
re.S即为 . 并且包括换行符在内的任意字符(. 不包括换行符)
re.U表示特殊字符集,依赖于 Unicode 字符属性数据库
re.X为了增加可读性,忽略空格和 # 后面的注释

re.finditer(),在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。

参数作用
pattern匹配的正则表达式
string要匹配的字符串
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等

正则表达式模式:

模式作用
^匹配字符串的开头
$匹配字符串的末尾
.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符
w匹配字母数字及下划线
W匹配非字母数字及下划线
S匹配任意非空字符

我相信大家此刻非常头疼,这么多,别说用了,就是死记硬背也记不住啊,对于新手来说一般不需要写的非常细致,当然,还是推荐大家多加练习,这时候就要介绍我们的一种简单粗暴的正则表达式模式——贪婪匹配,顾名思义,就是尽可能多的匹配字符,具体写法就是:

.*

对应的就是非贪婪匹配,就是尽可能少的匹配字符,具体写法就是:

.*?

举例,就针对字符串:

<img width=“100” alt=“肖申克的救赎” src=“https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg”

我们就需要提取““肖申克的救赎”这几个字,好,接下来,看操作,首先“<img width=“100” alt=” ”和“ " ”到这,中间是我们想要的文本,如果
我们使用贪婪匹配,它是尽可能多的匹配,那么它会将双引号左边之后的所有信息全部匹配上,如下:
正则表达式语句:

s = '<img width="100" alt="肖申克的救赎" src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg"'
it = re.compile(r'<img width="100" alt="(?P<name>.*)"')

result = it.finditer(s)
for item in result:
    print(item.group('name'))

结果:

E:Pythonpython.exe C:Users86134Desktoppython
e模块.py 
肖申克的救赎" src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg

进程已结束,退出代码0

所以,对于这种情况应该用非贪婪匹配
正则表达式语句:

s = '<img width="100" alt="肖申克的救赎" src="https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg"'
it = re.compile(r'<img width="100" alt="(?P<name>.*?)"')

result = it.finditer(s)
for item in result:
    print(item.group('name'))

结果:

E:Pythonpython.exe C:Users86134Desktoppython
e模块.py 
肖申克的救赎

进程已结束,退出代码0

到这里,相信大家已经初步掌握了贪婪匹配和非贪婪匹配,那我们上正菜:

首先导入re模块

import re

接下来开始操作这堆"字符"

  右键点击检查进入Network页面,主要是方便我们看清楚结构。
在这里插入图片描述
正则表达式语句:

pattern = re.compile(r'<img width="100" alt="(?P<name>.*?)"'
                     r'.*?<p class="">.*? '
                     r'导演: (?P<director>.*?)&nbsp.*?'
                     r'主演: (?P<actors>.*?)<br>'
                     r'(?P<year>.*?)&nbsp;.*?'
                     r'/&nbsp;(?P<country>.*?)&nbsp;.*?'
                     r';(?P<type>.*?)</p>.*?'
                     r'<span class="rating_num" property="v:average">(?P<mark>.*?)</span>.*?'
                     r'<span>(?P<evaluate>.*?)</span>', re.S)

效果
在这里插入图片描述

  深刻理解每条语句的用意,多多练习!

✨五.保存内容

result = pattern.finditer(h)
for item in result:
    with open('豆瓣电影信息.txt', 'a', encoding='utf-8') as fp:
        fp.write('
')
        fp.write(item.group('name'))
        fp.write('
')
        fp.write(item.group('director'))
        fp.write('
')
        fp.write(item.group('actors'))
        fp.write('
')
        fp.write(item.group('year'))
        fp.write('
')
        fp.write(item.group('country'))
        fp.write('
')
        fp.write(item.group('type'))
        fp.write('
')
        fp.write(item.group('mark'))
        fp.write('
')
        fp.write(item.group('evaluate'))
        fp.write('
')
        
print('爬取完成')

效果
在这里插入图片描述

✨六.总结(附完整代码)

  通过今天的小案例,针对今天的这个网页结构,我们可以多角度练习正则表达式,好了,今天就分享到这里,谢谢大家的观看,有什么想法记得评论区告诉我!拜拜~✨ ✨ ✨

?完整代码

import requests
import re

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/111.0.0.0 Safari/537.36'

}
response = requests.get(url=url, headers=headers)
response.encoding = response.apparent_encoding
# print(response.text)
h = response.text
pattern = re.compile(r'<img width="100" alt="(?P<name>.*?)"'
                     r'.*?<p class="">.*? '
                     r'导演: (?P<director>.*?)&nbsp.*?'
                     r'主演: (?P<actors>.*?)<br>'
                     r'(?P<year>.*?)&nbsp;.*?'
                     r'/&nbsp;(?P<country>.*?)&nbsp;.*?'
                     r';(?P<type>.*?)</p>.*?'
                     r'<span class="rating_num" property="v:average">(?P<mark>.*?)</span>.*?'
                     r'<span>(?P<evaluate>.*?)</span>', re.S)
result = pattern.finditer(h)
for item in result:
    with open('豆瓣电影信息.txt', 'a', encoding='utf-8') as fp:
        fp.write('
')
        fp.write(item.group('name'))
        fp.write('
')
        fp.write(item.group('director'))
        fp.write('
')
        fp.write(item.group('actors'))
        fp.write('
')
        fp.write(item.group('year').strip())
        fp.write('
')
        fp.write(item.group('country'))
        fp.write('
')
        fp.write(item.group('type'))
        fp.write('
')
        fp.write(item.group('mark'))
        fp.write('
')
        fp.write(item.group('evaluate'))
        fp.write('
')

print('爬取完成')

?往期好文推荐

  TOP?.自动驾驶技术未来大有可为❤️❤️❤️???❤️❤️❤️

  TOP?.Python爬虫 | 一文解决文章付费限制问题❤️❤️❤️???❤️❤️❤️

  TOP?.ChatGPT | 一文详解ChatGPT(学习必备)❤️❤️❤️???❤️❤️❤️

在这里插入图片描述

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。