赞
踩
[TOC]
Introduction
最近需要新浪微博的数据做研究,苦于找不到满意的数据,新浪微博的API对数据的获取有限制,也找不到合适的爬虫代码,遂自己实现了一个爬取新浪微博的爬虫。
爬取的数据是 新浪微博搜索某一个话题,得到的微博数据,下面是爬取到的有关苹果手机的微博示例:
之前也爬取过 豆瓣电影短评,但是好久没有再练手了,发现遗忘了很多知识点,加上新浪微博对爬虫的嗅觉异常灵敏,导致中间遇到了非常多的坑,不过好在大多数的问题,都已经解决了。所以今天索性总结一下,如果以后再写爬虫,可以拿来参考。
另外,我不是写爬虫的专家,对python的语法也不是很熟悉,也没有用scrapy这种爬虫工具(感觉用不到,因为爬虫的思想还是很简单的),所以写出来的爬虫应该比不上专业的水准,最后我会共享该程序的源码。
本文涉及的主要知识点有如下几个,其顺序大概是我写爬虫的步骤:
选择合适的爬取源
分析生成要爬取网站的url
根据url下载目标网页(利用cookie模拟登陆)
用Beautifulsoap和正则表达式(re)解析网页中需要的内容
将数据存储到csv文件中
另外,这五个主要步骤中遇到了很多坑,特别是第一个步骤和第三个步骤,我会在这些步骤中都提到。
Programming
选择合适的爬取源
由于之前爬取豆瓣电影评论的时候,我直接爬取了PC浏览器端的网页,而且在利用cookie进行模拟登陆后爬取的非常顺利,所以我觉得微博也应该这么爬取,所以我注册了一个微博的账号,通过浏览器端拿到了cookie,觉得万事大吉了。根本没有考虑到新浪微博和豆瓣的差异。
结果,利用cookie确实可以顺利爬到相关网页的数据,但是,当我看到服务器返回的HTML代码,我惊呆了,汉字全是unicode码,于是我查找了python3 如何 进行转码[文献1],了解到python3的转码函数:
# python 的str类型,通过encode() 可以转码为指定的bytes类型
encode()
# python 的bytes类型,通过decode() 可以转换成为指定的str类型
decode()
通过使用 html = urlopen(req).read()方法,我们能够获取到请求的网页数据,但是返回的是bytes类型,所以我们需要 html = urlopen(req).read().decode('utf-8')转成str类型。
但是即使如此,返回的HTML字符串,里面的汉字仍然是Unicode编码(\u开头,加上四个16进制的字符):
所以我们还要继续编解码,将里面的unicode字符转成中文,具体代码如下:
encode("utf-8").decode('unicode_escape')
如此得到的网页源码,中文才会正常显示。
但是问题又来了,微博返回的HTML源码太复杂了,我仔细分析后,才发现微博源码是HTML下又嵌套了一个HTML。
如图,我要爬取的内容就在嵌套的那个HTML下,而且里面的特殊字符都是用转义字符进行了转义,这样的网页在即使下载下来了,也要花大量的精力写规则进行解析。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。