大家好, 我是眼睛儿,从今天起,我会每周和大家分享一些学习爬虫相关的知识,.欢迎各位大佬的敦促和指导,也欢迎对爬虫感兴趣的小伙伴来交流,共同进步,废话不多说,上代码:
用python语言从繁多而复杂的数据中提取出有用的数据是相当繁琐的, 正则表达式为我们提供了一种简便的方法.想要做好爬虫, 第一步便是熟练使用正则表达式和re模块
正则表达式:
- 概述: 是一种对字符串操作的逻辑, 就是用一种事先定义好的一些特殊字符,及特定字符的组合,组成一个规则字符串,这个规则字符串表示 对字符串的一种过滤逻辑
- 字符组: 在同一个位置上可能出现的各种字符组成了一个字符组,在正则表达式中用[] 来表示
- [0-9] 所有数字
- [a-z] [A-Z] [0-9a-fA-F]
- 字符:
. ---- 匹配除换行符意外的任意字符 w ----匹配任意数字,字母,下划线 s ----匹配任意的空白符 d ----匹配数字 ----匹配一个换行符 ----匹配一个制表符 ----匹配一个单词的结尾 ^ ----匹配字符串的开始 &----匹配字符串的结尾 W ----匹配任意非数字,字母,下划线 D----匹配非数字 S----匹配非空白符 a|b ----匹配字符a或字符b ()匹配括号内的表达式,也表示一个组 [...] ----匹配字符组中的字符 [^...] ---匹配除了字符中字符以外的任意字符
- 量词
* 重复零次或多次 + 出现一次或多次 ? 重复0次或多次 {n} 出现n次 {n,m}出现n到m次 {n,}出现n次或跟多次
- 惰性匹配
- 正则默认都是尽量多的匹配, 加上?就是尽量少的匹配
*? 重复任意次,但尽可能少重复 +? 重复1次或更多次,但尽可能少重复 ?? 重复0次或1次,但尽可能少重复 {n,m}? 重复n到m次,但尽可能少重复 {n,}? 重复n次以上,但尽可能少重复 . 是任意字符 * 是取 0 至 无限长度 ? 是非贪婪模式。 何在一起就是 取尽量少的任意字符,一般不会这么单独写,他大多用在: .*?x 就是取前面任意长度的字符,直到一个x出现
- 正则默认都是尽量多的匹配, 加上?就是尽量少的匹配
- 转义符
利用re模块实现猫眼电影top100排名爬取
import requests
import re
def get_html(url,data):
ret = requests.get(url, params=data)
return ret.text
# re_before = re.compile('<dd>s*.*s*.*?title="(.*?)"')
# movies = re.finditer(movie_re, ret) #找出当前页面十个电影,得到一个可迭代对象
# movie_obj = next(movies).group() #通过next方法拿到第一个电影
# print(movie_obj)
#
# movie_name = re.findall('s="name".*?title="(.*?)"', movie_obj) #拿到第一个电影的电影名
# print(movie_name[0])
#
# movie_star = re.findall('s="star">s*(.*?)s*<', movie_obj) #拿到电影主演
# print(movie_star[0])
#
# movie_releasetime = re.search('s="releasetime">上映时间:(?P<time>.*?)<', movie_obj) #拿到电影时间
# print(movie_releasetime.group('time'))
def get_info(html_res):
movie_re = re.compile('<dd>[dD]*?</dd>')
movies = re.finditer(movie_re, html_res)
for movie_obj in movies:
movie_obj = movie_obj.group()
movie_name = re.findall('s="name".*?title="(.*?)"', movie_obj)[0]
movie_star = re.findall('s="star">s*(.*?)s*<', movie_obj)[0]
movie_releasetime = re.search('s="releasetime">上映时间:(?P<time>.*?)<', movie_obj).group('time')
movieinfo = f'电影名:{movie_name}, {movie_star}, 上映时间:{movie_releasetime}'
print(movieinfo)
url = 'https://maoyan.com/board/4'
data = {
'offset':0
}
for i in range(10):
data['offset'] = i * 10
html_res = get_html(url, data)
get_info(html_res)