re模块|py03
文章概览
- 正则匹配
- 浅爬豆瓣电影
一、正则匹配
正则表达式就是字符串匹配的模式,常用来检查某段字符串是否含有某个、某种子串,将满足条件的子串替换或者取出来。
正则表达式从左到右,按照优先级匹配,其中正则表达式.*?可以解决大部分匹配,是最常用的正则匹配,它截取满足条件的最小部分。
示例:提取满足正则表达式的句子。
正则表达式的作用是从一大段文字中找到满足条件的部分。
s = """
<div class='hurry'><span id='1'>Hello</span></div>
<div class='lucky'><span id='2'>Hello2</span></div>
<div class='miki'><span id='3'>Hello3</span></div>
"""
obj = re.compile(r"<div class='.*?'><span id='\d+'>.*?</span></div>", re.S)
result = obj.finditer(s)
for it in result:
print(it.group())
示例:提取正则匹配的字段。
上一个例子找到一大段文字中符合要求的句子,那如何进一步提取出某个字符串呢?使用(?P
obj = re.compile(r"<div class='.*?'><span id='\d+'>(?P<x>.*?)</span></div>", re.S)
result = obj.finditer(s)
for it in result:
print(it.group("x"))
二、爬取豆瓣电影
爬取要注意的点:
(1)首先需要导入两个包,requests(拿到页面源代码)、re(提取信息)、csv(保存到文件里)。
(2)为了防止反爬将UA加入请求头。(正则和基本流程正确,但爬不到东西,考虑反爬)
(3)使用正则匹配想要爬取的数据,使用.*?过滤无用信息,用(?P
(4)分析要爬取的页面、内容。(电影名、时间、评分、评价人数)
(5)如果爬取的内容有多余空格,使用strip()清除。
import re
import requests
import csv
url = "https://movie.douban.com/chart"
headers = {
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"
}
resp = requests.get(url,headers=headers)
page_content = resp.text
obj = re.compile(r'<a class="nbg" href=.*?title="(?P<title>.*?)"'
r'.*?</a>.*?</a>.*?">(?P<date>.*?) / '
r'.*?<span class="rating_nums">(?P<score>.*?)</span>',re.S)
result = obj.finditer(page_content)
for it in result:
print(it.group("title"))
print(it.group("score"))
print(it.group("date").strip())
将数据存储到文件中
CSV,逗号分隔值文件,是一种纯文本文件(纯文本文件还有TXT,JSON等—),是数据处理中经常会用到的文本格式,可以和Excel进行转换。
需要对上面代码做如下修改:
result = obj.finditer(page_content)
f = open("data.csv",mode="w")
csvwriter = csv.writer(f)
for it in result:
# print(it.group("title"))
# print(it.group("score"))
# print(it.group("date").strip())
dic = it.groupdict()
dic['date'] = dic['date'].strip()
csvwriter.writerow(dic.values())
f.close()
浙公网安备 33010602011771号