写爬微信投票结果遇到的正则的一个疏忽

——首先本文不是研究怎么写一个爬虫。因为我初学爬虫,抓取方式和代码质量都不高。

     初学正则,便踩了坑。其实也不能算坑,是自己没有考虑周全,这篇博文也算是给自己的一个警示吧。

  是这样,我闲来无事想爬一下微信的投票,正好看到朋友圈有一条投票的分享。我便用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
 完整代码不再给出。不过这样直接把原始内容写到文件内分析实在不方便,考虑以后再写一个分析程序。

 另外有更好的方法或者代码不足欢迎指出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值