170313-pyGUI爬虫和正则回溯陷阱
1625-5 王子昂 总结《2017年3月13日》 【连续第163天总结】
A.Python 爬虫
B.昨天做好了CUI的愿望单爬虫,但是由于命令行的编码默认是GB2312的,与python的utf-8不匹配,所以萌生了制作GUI的想法
很简单,因为以前用过Tk的控制,在这个显示程序中完全不需要交互,而只是显示即可
刚开始是爬取完成以后进入mainloop()显示,测试了一下觉得有些迟滞,如果网络环境不好的话显示想必会更加慢
那先显示界面,再进行爬取,然后输出到文本框中不就行了吗。
尝试了一下,直接在mainloop()后添加text.insert()方法,发现没有反应
百思不得其解,明明之前做五子棋的时候也是开始mainloop()以后再更新文本的。检查了代码半天发现,之前的五子棋中的所有insert()方法都是绑定在某个函数,由事件驱动的;而这次是直接一条命令,因此无法执行。
遂查询使用after()(延时器)方法,仍然不行。思考了一下,这次绑定after方法是在mainloop开始之后的,所以绑定失败。于是把after()方法放在mainloop()之前,终于成功。
光秃秃的界面有些丑,再加上如果出现了不熟悉的游戏名字,没有图片来配合会认不出来。于是尝试爬取游戏图标地址并显示在界面中。查了一通,应该先用urllib2模块把图片以二进制下载下来,然后转换成gif格式用label控件显示在界面上
但是第一步,爬取图片链接就出现了问题:在线正则测试的网站对于python似乎有什么看法,在截取的一小段文本中php的正则只需要几百步,python却要几万步。把整个网页的源码放入以后,Python显示timeout,php则是catastrophic backtracking。
查询得知,正则回溯陷阱---由于正则表达式的写法,使得系统需要花费过多的时间和步数去查询。
举一个栗子:
考虑这样一个正则
/(a*)*b/
,用它来匹配”aaaaaaaaaa”(10个a组成的字符串)
花费了6143步才完成!如果再加上一个a呢,变成11个a组成的字符串会怎么样?
变成12287步了,翻了一倍。事实就是这样,当出现以上这种量词嵌套时,如果遭遇最坏情况(最后一个字符才能确实匹配不成功),那么这时正则引擎陷入灾难性回溯,时间复杂度为指数级)。 如果你试着再嵌套一层,9个a组成的字符串就能突破100万步了……
这才是正则表达式的难点和精髓:优化算法。
\d表示数字,\w表示字母,明明用.就可以全部通配,为什么要加以限制呢?---为了节省时间和资源
回溯算法非常方便,但也非常可怕。一旦落入回溯陷阱将会花费大量的时间。
于是图片的地址就爬不下来了,因为它的标识不易提取
其实我觉得使用尾部匹配应该可以快捷一点的,不过不知道为什么在线正则测试的网站似乎出了问题,python完全处理不了整页的源码。
附上代码:
#encoding:utf-8 import urllib2 import re import Tkinter top=Tkinter.Tk() text=Tkinter.Text(width=100) text.pack()def spider():url='http://steamcommunity.com/id/whklhh/wishlist' request=urllib2.Request(url)response=urllib2.urlopen(request)data=response.read() # reg=r'<div class="gameListRowLogo">(?:.+?\n.+?){2}src="(.+?)">(?:.*?\n.+?){5}'+\ reg=r'<div class="discount_block discount_block_inline">.+?\n.+?>(-\d+%)(?:.+?\n.+?){2}¥ (\d+).+?\n.+?¥ (\d+)'+\r'(?:.+?\n.+?){4}href="(.+?)"(?:.+?\n.+?){6}>(.+?)<' imgre=re.compile(reg)imglist=re.findall(imgre,data)for pro in imglist:text.insert('end',("%s\n\t现价:%s,原价:%s,折扣:%s,商品页面:%s\n")%(pro[4],pro[2],pro[1],pro[0],pro[3])) text.after(1,spider) Tkinter.mainloop()
C. 明日计划
Java 日志
170313-pyGUI爬虫和正则回溯陷阱相关推荐
- 正则表达式学习——(2)正则回溯
参考文章: https://www.zhihu.com/question/48219401/answer/1476436385 https://www.jianshu.com/p/48dc319f68 ...
- app.vue里使用data_Python爬虫使用正则爬取网站,正则都不会就别玩爬虫了!
本文章的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,滥用技术产生的风险与本人无关.本文章是自己学习的一些记录.欢迎各位大佬点评! 源码在GitHub上面,且相关介绍更 ...
- php 正则 回溯,PHP正则匹配绕过
之前没有从机制上去了解过PHP正则匹配绕过具体是怎么一回事,于是主动去网上找了一些资料来加深理解 NFA与正则表达式 常见的正则引擎,被细分为DFA(确定性有限状态自动机)与NFA(非确定性有限状态自 ...
- php 正则 回溯,php 正则表达式效率 贪婪、非贪婪与回溯分析
先扫盲一下什么是正则表达式的贪婪,什么是非贪婪?或者说什么是匹配优先量词,什么是忽略优先量词? 好吧,我也不知道概念是什么,来举个例子吧. 某同学想过滤之间的内容,那是这么写正则以及程序的. $str ...
- 懒惰和贪婪-正则回溯
需要一定的正则基础,并且是基于JS写的文章. 正则表达式是从左往右匹配的.在使用正则表达式的时候我们知道/.*/可以匹配一个字字符串中所有的字符,/.*?/却一个字符都匹配不到./(.*)\d/中的. ...
- nginx的正则回溯和灾难性回溯
正则的回溯 我们先了解一下什么是回溯 https://zhuanlan.zhihu.com/p/27417442 这篇文章将的比较详细,我选取其中一个例子给大家简单介绍一下 当用 /".*& ...
- python爬虫使用正则爬取网站
本文章的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,滥用技术产生的风险与本人无关. 本文章是自己学习的一些记录.欢迎各位大佬点评! 在这里放上我爬取的数据的网页,我将 ...
- Python爬虫之正则 BeautifulSoup4解析HTML
目录: 前言 编码演变历史 1 Charset Character Encoding 2 ASCII字符集与编码 3 中文字符集与编码 4 大一统的Unicode 5 UTF-8编码 6 Python ...
- python爬虫(正则获取元素)
import re import requests import ua_info import random from lxml import etree import json from pprin ...
- Python 爬虫 使用正则去掉不想要的网页元素
在做爬虫的时候,我们总是不想去看到网页的注释,或者是网页的一些其他元素,有没有好的办法去掉他们呢? 例如:下面的问题 第一种情况<ahref="http://artso.artron. ...
最新文章
- 帝国cms底部代码哪里改?要修改版权和统计代码
- 【开发环境】Windows 安装 PyCharm 开发环境 ( 下载 PyCharm | 安装 PyCharm | 在 PyCharm 中创建 Python 工程 )
- 绘图操作(点,线,多边形,徒手多边形等)
- bean validation校验方法参数_项目启动时首先校验Spring Boot配置参数
- C++ Primer 第五版 第7章类 7.1——类讲解(成员函数、非成员函数、构造函数)习题答案
- [转]sqlserver 创建分区表
- 前景检测算法(十六)--背景减除结束篇
- DoTween插件使用
- php socket 读网页,PHP webSocket实现网页
- java基础下载音乐_抖音上超好听的神曲音乐,Python教你一次性下载
- 计算机管理删除打印机驱动,彻底删除打印机驱动的方法
- TARA-基于J3061的概念阶段流程
- excel表格中身份证信息提取出生年月日,年龄,性别,出生地
- 最大的商业价值来自给人自由--------------解放生产力与互联网用户分析之我见
- C++~STL容器实例——三国武将阵营管理系统
- 动态规划练习三:换钱问题(动态规划概念理解与记忆搜索法概念理解对比)
- 关于51单片机驱动DS18B20代码的感想
- error LNK2019 ,error LNK2001:无法解析的外部符号,LINK : fatal error LNK1104: 无法打开文件
- 2021年中国氨纶行业发展现状及进出口状况分析:氨纶价格创十年新高 [图]
- 添加到收藏夹和设置首页代码大全
热门文章
- PL/SQL语言简单案例
- 广西壮族自治区公安厅信息中心异地容灾系统(三期)采购185万
- LibOpenCM3(二) 项目模板 Makefile分析
- 星星之火-6:无线通信必须知道的“信号”与傅里叶信号变换
- 键盘部分失灵/被锁定解决办法
- 在线评判系统java代码_sojV1.0 Online Judge System
在线评判系统是一个 联合开发网 - pudn.com...
- jQuery 选择器
- 写好英语科技论文的诀窍: 主动迎合读者期望,预先回答专家可能质疑
- 威廉玛丽学院计算机专业好吗,威廉玛丽学院计算机科学研究生最新专业排名
- linux 删除文件的最后一行