您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息
三六零分类信息网 > 合肥分类信息网,免费分类信息发布

python用正则爬取豆瓣电影排行榜,连老司机都不知道的奥秘

2023/2/25 16:15:46发布86次查看
使用了tkinter做了简单页面
首先分析要爬取的url, 发现每个页面有25条内容, 总共有十页, 第一页的url为https://movie.douban/top250?start=0&filter=
第二页的url为https://movie.douban/top250?start=25&filter=
第三页第四页也是类似的url, 只是修改了start后面的数字, 第一页是0, 往后每增加25, 所以url的格式为https://movie.douban/top250?start=+{id}
然后分析如何爬取内容:
首先爬取标题:
查看源代码后, 发现标题是放在这样的代码:
肖申克的救赎/the shawshank redemption/月黑高飞(港) / 刺激1995(台)12345发现电影的名称一般都放在
电影名称1这样的标记对中, 所以根据这个可以写出正则表达式:
(.*?)1不过在后面的测试中发现这样写的话, 每个电影名称能获取两个信息
肖申克的救赎/the shawshank redemption12显然第二条信息不是我们想要的, 经过对比发现第二条信息中都会有两个空格的代码, 所以把&给过滤掉就可以了:
(.[^&]*?)1接下来爬取评分, 评分一般放在这样的代码中:
9.6716019人评价
123456这个正则就很好写了:
v:average>(.*?)1这样就ok啦, 这个程序还是非常简单的, 上源代码:
# -*- coding: utf-8 -*-from tkinter import *from scrolledtext import scrolledtextimport requests, re, threadingdef replite(id): varl.set('正在获取第%d页内容' % (id / 25 + 1)) html = 'https://movie.douban/top250?start=' + str(id) response = requests.get(html).text # response = unicode(response, 'gbk').encode('utf-8') response = response.encode('utf-8 ') # print response # reg = r'(.*?).*?v:average>(.*?)' regtitle = r'(.[^&]*?)' regstars = r'.*?v:average>(.*?)' regtitle = repile(regtitle) regstars = repile(regstars) titles = re.findall(regtitle, response) stars = re.findall(regstars, response) info = list(zip(titles, stars)) return infodef write(): varl.set('开始爬取内容') id = 0 nums = 1 while id < 250: res = replite(id) id += 25 for each in res: text.insert(end, 'no.%d\t%-30s%s分\n' % (nums, each[0], each[1])) nums += 1 varl.set('获取内容成功')def start(): t1 = threading.thread(target=write) t1.start()def save(): content = text.get(0.0, end).encode('gbk') textfile = open(u'e:\\豆瓣电影排行250.txt', 'w') textfile.write(content) textfile.close()root = tk()root.title('豆瓣电影top250')root.geometry('820x500+400+200')text = scrolledtext(root, font=('楷体', 15), width=80, height=20)text.grid()frame = frame(root)frame.grid()# 启动爬虫功能startbutton = button(frame, text='开始', font=('楷体', 18), command=start)startbutton.grid()startbutton.pack(side=left)# 保存爬取信息savebutton = button(frame, text='保存文件', font=('楷体', 18), command=save)savebutton.grid()savebutton.pack(side=left)# 退出程序exitbutton = button(frame, text='退出', font=('楷体', 18), command=frame.quit)exitbutton.grid()exitbutton.pack(side=left)varl = stringvar()info_label = label(root, fg='red', textvariable=varl)info_label.grid()varl.set('准备中....')root.mainloop()
下面给大家分享python正则详解:
正则表达式是一个很强大的字符串处理工具,几乎任何关于字符串的操作都可以使用正则表达式来完成,作为一个爬虫工作者,每天和字符串打交道,正则表达式更是不可或缺的技能,正则表达式的在不同的语言中使用方式可能不一样,不过只要学会了任意一门语言的正则表达式用法,其他语言中大部分也只是换了个函数的名称而已,本质都是一样的。下面,我来介绍一下python中的正则表达式是怎么使用的。
首先,python中的正则表达式大致分为以下几部分:
元字符模式函数re 内置对象用法分组用法环视用法所有关于正则表达式的操作都使用 python 标准库中的 re 模块。
一、元字符 (参见 python 模块 re 文档)
. 匹配任意字符(不包括换行符)^ 匹配开始位置,多行模式下匹配每一行的开始$ 匹配结束位置,多行模式下匹配每一行的结束* 匹配前一个元字符0到多次+ 匹配前一个元字符1到多次? 匹配前一个元字符0到1次{m,n} 匹配前一个元字符m到n次\\ 转义字符,跟在其后的字符将失去作为特殊元字符的含义,例如\\.只能匹配.,不能再匹配任意字符[] 字符集,一个字符的集合,可匹配其中任意一个字符| 逻辑表达式 或 ,比如 a|b 代表可匹配 a 或者 b(...) 分组,默认为捕获,即被分组的内容可以被单独取出,默认每个分组有个索引,从 1 开始,按照(的顺序决定索引值(?ilmsux) 分组中可以设置模式,ilmsux之中的每个字符代表一个模式,用法参见 模式 i(?:...) 分组的不捕获模式,计算索引时会跳过这个分组(?p...) 分组的命名模式,取此分组中的内容时可以使用索引也可以使用name(?p=name) 分组的引用模式,可在同一个正则表达式用引用前面命名过的正则(?#...) 注释,不影响正则表达式其它部分,用法参见 模式 i(?=...) 顺序肯定环视,表示所在位置右侧能够匹配括号内正则(?!...) 顺序否定环视,表示所在位置右侧不能匹配括号内正则(? 'hello world!'
l locale, 字符集本地化。这个功能是为了支持多语言版本的字符集使用环境的,比如在转义符\w,在英文环境下,它代表[a-za-z0-9_],即所以英文字符和数字。如果在一个法语环境下使用,缺省设置下,不能匹配é 或 04。加上这l选项和就可以匹配了。不过这个对于中文环境似乎没有什么用,它仍然不能匹配中文字符。m multiline,多行模式, 改变 ^ 和 $ 的行为
s = '''first linesecond linethird line'''# ^regex_start = repile(^\w+)print regex_start.findall(s)# output> ['first']regex_start_m = repile(^\w+, re.m)print regex_start_m.findall(s)# output> ['first', 'second', 'third']#$regex_end = repile(\w+$)print regex_end.findall(s)# output> ['line']regex_end_m = repile(\w+$, re.m)print regex_end_m.findall(s)# output> ['line', 'line', 'line']
s  dotall,此模式下 '.' 的匹配不受限制,可匹配任何字符,包括换行符
s = '''first linesecond linethird line'''#regex = repile(.+)print regex.findall(s)# output> ['first line', 'second line', 'third line']# re.sregex_dotall = repile(.+, re.s)print regex_dotall.findall(s)# output> ['first line\nsecond line\nthird line']
x verbose,冗余模式, 此模式忽略正则表达式中的空白和#号的注释,例如写一个匹配邮箱的正则表达式email_regex = repile([\w+\.]+@[a-za-z\d]+\.(com|cn))email_regex = repile([\w+\.]+ # 匹配@符前的部分 @ # @符 [a-za-z\d]+ # 邮箱类别 \.(com|cn) # 邮箱后缀 , re.x)u unicode,使用 \w, \w, \b, \b 这些元字符时将按照 unicode 定义的属性.正则表达式的模式是可以同时使用多个的,在 python 里面使用按位或运算符 | 同时添加多个模式
如 repile('', re.i|re.m|re.s)
每个模式在 re 模块中其实就是不同的数字
print re.i# output> 2print re.l# output> 4print re.m# output> 8print re.s# output> 16print re.x# output> 64print re.u# output> 32四、re 内置对象用法
sre_pattern 这个对象是一个编译后的正则表达式,编译后不仅能够复用和提升效率,同时也能够获得一些其他的关于正则表达式的信息属性:
flags 编译时指定的模式groupindex 以正则表达式中有别名的组的别名为键、以该组对应的编号为值的字典,没有别名的组不包含在内。groups 正则表达式中分组的数量
pattern 编译时用的正则表达式s = 'hello, mr.gumby : 2016/10/26'p = repile('''(?: # 构造一个不捕获分组 用于使用 | (?p\w+\.\w+) # 匹配 mr.gumby | # 或 (?p\s+\.\w+) # 一个匹配不到的命名分组 ) .*? # 匹配 : (\d+) # 匹配 2016 ''', re.x)
好了,今天的知识就分享到这里,欢迎关注爱编程的南风,私信关键词:学习资料,获取更多学习资源,如果文章对你有有帮助,请收藏关注,在今后与你分享更多学习python的文章。同时欢迎在下面评论区留言如何学习python。
合肥分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录