经过一天一夜的奋战(有点夸张),终于把这个东西搞定了,期间遇到了很多困难(后面会慢慢展开),不过,睿智(蠢笨)如我,在各大博客和蛇崽兄弟的指导下,终于完成了这一切。为了不让大家重蹈覆辙,我将整个过程都记录了下来,嗯,共勉。
Tools & Background
目标:在豆瓣上取得所有《无问西东》的有价值的评论,并整理分析得出评价中最常用的词汇成图。
IOS
Python3
PyCharm
Scrapy(xpath)
结巴分词
matplotlib
wordcloud
基本的网络交互知识(这里附上一个比较全面但不完整的介绍)
Grab info
熟悉Scrapy,并在PyCharm中创建框架。
在 pyCharm的terminal里,
用 'scrapy startproject object_name' 创建scrapy项目 这里object_name用douban
用'scrapy crawl name' 作为测试命令, 这里name用 dongxi_comment
Attention:有的时候因为创建文件的层次不同,需要用cd命令返回上一层。(compiler会提示你)-
创建一个基本类,调试setting参数。
name是必须的,上面提到的测试命令就是用的这个name,代表这个爬虫程序。(可以随便取)
starts_urls是必须的,因为这个就相当于我们爬的起点。
在scrapy的官方tutorial里,这些就够了,甚至不需要发起request,因为这个框架可以自动识别然后调用接下来的parse函数。看起来很方便,但是如果要对一些默认的设置进行修改或者,做一些预处理,这个就很麻烦了,或许可以在setting里设置,但是预处理就做不到了(后面会提到)。所以我这里不会按照官文的格式,但也不会差太多。
page: 用来记录一共爬了多少页。
cookie:防止因为登录需要而被限制的参数。
headers:模拟浏览器发生请求的参数。
这上面两个参数都是从浏览器中得到(如何得到),cookie比较特殊,因为这里得到的值很不规范,服务器不能识别,所以后面有一个处理
-
start_requests 函数设置
整个函数分为3个部分:
A. 对cookie的预处理(引用来源)
B. 创建文件夹和路径切换
C. 发起第一次请求(需要改变的参数,才写到括号里,否则都是默认参数值)。
-
主函数设置
A. 先确定目标网站的HTML架构,学习过最好,这样可以很快定位数据位置。如图,先定位到div(class=comment),方便后面提取这个区间的数据
B. 接着,打开一个新的txt,注意参数(a+),表示没有相应的文件就创建,有就续写。注意,所有的写入都应该在with这个block里完成,程序一旦离开该block,则文件自动close。
C. 因为这里有二十个comments,所以我们要用一个for循环,同时记录赞同的数据量,少于10,则不在数据收集范围,同时取评论时间,方便后期数据分析。
Attention:这里有个坑!大家注意定位评论时间的class属性:网页上显示为“comment-time ”,不是“comment-time”,你要问我有什么区别?time后面有个空格啊!!! 在这里卡了一个小时,不说了,哭去。
<span class="comment-time " title="2018-01-12 22:51:11">
2018-01-12
</span>
D. 最后一部分就是对下一页url的提取,这里有两种方法,一种就是上图中看到的:先取点得到一个残缺的url,再加上缺失的部分。用Request发起一次新的请求。
还有一种就是利用response.follow,该函数可以直接补充相应url缺失的部分,如图
大家肯定也看到了,这里用的是yield,而不是return,为什么不用return,因为用了会报错啊,开个玩笑,这里有yield的相关资料哦!关于follow更多可以在官网找到
Lookback
有一些坑在文中已经提到过了,那么还有什么呢?
爬取中文时,pyCharm的self.log()打印出来的都是Unicode(在另一种编码规则下),也就是你我都看不懂。。。但不是乱码,虽然看不懂,但是output到txt file里(或者数据库)是可以被认识的(在UTF-8的编码规则下)。知乎解释
输出到具体某个文件时(txt),我用了python3 的open(),close(),总是会出现失败,具体error忘了截图,大概是Unicode和Ascii的冲突吧。所以我就用到了with,它不用手动close,我之前好像提到过哈。
-
差点忘记这里有一个巨坑,如下图
乍一看,这个红色处调用是没有问题的,但是实际执行的时候,是被忽略掉的。我以为response可以作为一个参数进行传递,但是实际上好像不行。
那怎么做呢?
再发起一次请求,利用callback调用函数。
Process
- 先导入数据。
- 结巴分词处理,不用担心数字,它会自动过滤。
- wordcloud可以用pip直接下载(至少mac可以),因为它不支持中文显示,所以要自己设置中文字体。关于wordcloud的参数这里有
- 最后就是展示图片了,用到了常用的数据处理包—matplotlib。
Outcome
想那次哭的稀里哗啦,也就是三个月前,不多说了,上图。
眼看都要天黑了,去跑步了啦。
彩蛋!!!!
这里推荐我在编程过程中循环听的歌:
辻詩音的《I am beautiful》
Nylas的《废物晒太阳》
徐秉龙的《白羊》
冯提莫的《佛系少女》