写爬微信投票结果遇到的正则的一个疏忽
2016-12-24 21:39
204 查看
——首先本文不是研究怎么写一个爬虫。因为我初学爬虫,抓取方式和代码质量都不高。
初学正则,便踩了坑。其实也不能算坑,是自己没有考虑周全,这篇博文也算是给自己的一个警示吧。
是这样,我闲来无事想爬一下微信的投票,正好看到朋友圈有一条投票的分享。我便用chrome打开看了源码,发现主页源码中并没有结果。我便打开投票框架的源码,结果很快就发现了投票结果。(很奇怪,框架上提示我是无法投票而且没有显示票数,我却能在源码中找到投票数据)。然后我就尝试对这个源码的url进行get请求,毫无阻拦就请求到了所有源码。(也许是鹅厂觉得我爬个数据并不会造成危害,我连headers就不用模拟就请求到了数据)。下列代码我还是模拟了浏览器。
def download_code(url):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36'}
data = requests.get(url, headers = headers).content
return data
然后,对然后我用正则表达式解析了文本,提取了我要的数据。嗯,我测第一个样例毫无问题,但是我测第二个就出现了我解析文本后只取出了一半的数据。???难道有反爬机制?
但是我打印了爬下来源码,毫无问题。那么就是我正则表达式出了问题。但是第一个没有出现问题啊!我有分析了一下表达式,也挺合理的!然后我就开始了无限修改正则表达式。对的,我被自己的智商折服,我改了一个多小时。后来突然想到我给的是{\S*},万一花括号里有换行怎么办!但是我加上换行,依旧不起作用。我又看了源码,发现花括号里是直直的一行代码,并没有换行。后来,调了半天发现是里面有一个空格!哭着改完代码,果然爬下来的数据正常了。以后我正则要接受花括号里的任意内容就这么写了{[\S
]*}(当然只能一行。。。),如果对于多行我觉得可以使用{[\S\s^}]*}.下列便是我修改正则表达式抓取数据的代码:
def prase_html(html):
soup = BeautifulSoup(html, "html.parser")
vote_example = re.compile("voteInfo\=\{[\S ]*\}")
instance = re.compile("\{\"name\"\:\"\S*\"cnt\"\:[0-9]*\S*\}")
#分析源码来写出正则来抓取数据
vote_ = soup.getText()
vote = re.findall(vote_example, vote_)
getvote = re.findall(instance, str(vote))
return getvote 完整代码不再给出。不过这样直接把原始内容写到文件内分析实在不方便,考虑以后再写一个分析程序。
另外有更好的方法或者代码不足欢迎指出。
初学正则,便踩了坑。其实也不能算坑,是自己没有考虑周全,这篇博文也算是给自己的一个警示吧。
是这样,我闲来无事想爬一下微信的投票,正好看到朋友圈有一条投票的分享。我便用chrome打开看了源码,发现主页源码中并没有结果。我便打开投票框架的源码,结果很快就发现了投票结果。(很奇怪,框架上提示我是无法投票而且没有显示票数,我却能在源码中找到投票数据)。然后我就尝试对这个源码的url进行get请求,毫无阻拦就请求到了所有源码。(也许是鹅厂觉得我爬个数据并不会造成危害,我连headers就不用模拟就请求到了数据)。下列代码我还是模拟了浏览器。
def download_code(url):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36'}
data = requests.get(url, headers = headers).content
return data
然后,对然后我用正则表达式解析了文本,提取了我要的数据。嗯,我测第一个样例毫无问题,但是我测第二个就出现了我解析文本后只取出了一半的数据。???难道有反爬机制?
但是我打印了爬下来源码,毫无问题。那么就是我正则表达式出了问题。但是第一个没有出现问题啊!我有分析了一下表达式,也挺合理的!然后我就开始了无限修改正则表达式。对的,我被自己的智商折服,我改了一个多小时。后来突然想到我给的是{\S*},万一花括号里有换行怎么办!但是我加上换行,依旧不起作用。我又看了源码,发现花括号里是直直的一行代码,并没有换行。后来,调了半天发现是里面有一个空格!哭着改完代码,果然爬下来的数据正常了。以后我正则要接受花括号里的任意内容就这么写了{[\S
]*}(当然只能一行。。。),如果对于多行我觉得可以使用{[\S\s^}]*}.下列便是我修改正则表达式抓取数据的代码:
def prase_html(html):
soup = BeautifulSoup(html, "html.parser")
vote_example = re.compile("voteInfo\=\{[\S ]*\}")
instance = re.compile("\{\"name\"\:\"\S*\"cnt\"\:[0-9]*\S*\}")
#分析源码来写出正则来抓取数据
vote_ = soup.getText()
vote = re.findall(vote_example, vote_)
getvote = re.findall(instance, str(vote))
return getvote 完整代码不再给出。不过这样直接把原始内容写到文件内分析实在不方便,考虑以后再写一个分析程序。
另外有更好的方法或者代码不足欢迎指出。
相关文章推荐
- 几次面试都遇到同一个问题,真是郁闷,长时间不写正则快忘了
- debug和release编译结果在多线程的遇到的一个问题
- 我黑了一个少妇的微信,结果发现……
- iOS微信分享在6plus上遇到一个坑
- JMeter 如何把上一个请求的结果作为下一个请求的参数 —— 使用正则提取器
- 为一个正则表达式在输出和不输出情况下结果的差异感到十分疑惑!!!
- jmeter 如何将上一个请求的结果作为下一个请求的参数——使用正则提取器
- java微信支付开发中遇到的各种问题,微信官方的DEMO就是一个坑
- jmeter 如何将上一个请求的结果作为下一个请求的参数——使用正则提取器
- 在做毕业设计的过程中,遇到了几个错误导致结果不对,在这里做一个总结
- php中用正则匹配多个结果,随机替换其中一个结果
- PHP 正则 中遇到的一个小问题, 卡死,执行慢
- 编写一个基于HBase的MR程序,结果遇到一个错:ERROR security.UserGroupInformation - PriviledgedActionException as ,求帮助
- iOS微信支持遇到的问题:只显示一个确定按钮、onResp不回调、闪回
- 遇到一个gcc编译器版本导致的运行结果有差异的问题
- 运行一个命令或程序获取结果/正则表达式查找匹配/分隔字符串
- 遇到了一个HttpURLConnection乱码问题:结果是JVM file.encoding错误
- JMeter 如何把上一个请求的结果作为下一个请求的参数 —— 使用正则提取器
- Perl学习笔记(2)----正则表达式数字匹配的一个疏忽
- java中正则匹配结果到一个String数组中