前言 最近迷上了Python爬虫,我们的hadoop课程也正好涉及到了这个内容,所以就想结合课程内容(爬取京东手机评论https://item.jd.com/100003060627.html#crumb-wrap )写一篇关于python爬虫到数据可视化的完整流程。
打开目标网站https://item.jd.com/100003060627.html#crumb-wrap 我们要爬取该手机的评论信息,就要先找到“我们点击查看评论时,浏览器向服务器请求来的文件”在该文件中有我们需要的url地址和求头(请求头包括referer:重定向 和 user-agent:用户代理),浏览器都会有一些反爬虫的措施,所以需要使用该请求头去模拟浏览器向服务器请求数据。至于怎么找到我们需要的文件,博主只能说:这需要一些前端的知识和自己的经验,爬虫做多了 额…不对,这样不太好,爬虫是有些偏灰暗的,我是说熟能生巧啊。可以先看一下文件的Preview,如下即为我们需要的信息文件,然后点击Headers先复制我们需要的信息到编译器中,为我们待会写代码时准备:
获取并筛选数据 拿到我们需要的url地址和请求头后,先分析一下url地址,主要是它的后半部分,它是由字符串拼接而成的,比如这里的url地址:https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv21252&productId=100003060627&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1
在这里**page=**后面跟的就是第几页评论的信息(数据),不信你点击第二页评论时page=后面就是1&pageSize=10&isShadowSku=0&fold=1,由0变为了1(感觉在侮辱自己的智商(艹皿艹)),由此我们可以将url地址切割为两部分,将变化的数据用变量表示,然后再将两部分拼接得到最终的url地址,我们就可以通过控制变量来获取对应的数据量了,如下为切割和拼接的过程和结果
1 2 3 4 5 6 url_header="https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv19450&productId=100003060627&score=0&sortType=5&page=" url_tail="&pageSize=10&isShadowSku=0&rid=0&fold=1" url_mate20=url_header + str(page+1 ) + url_tail
现在正式开始搬砖了,先导入我们需要用到的两个库,也可以叫包、模块
1 2 import requestsimport json
利用请求头和拼接得到的最终url,循环请求每一条评论数据,并将请求到的数据转化格式为json格式保存为本地的txt文件,如下我保存到自己电脑D:\python_data目录下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 for page in range(20 ): url_tail="&pageSize=10&isShadowSku=0&rid=0&fold=1" url_mate20=url_header + str(page+1 ) + url_tail res=requests.get(url_mate20,headers=headers) data=json.loads(res.text[27 :-2 ]) comment=(data['comments' ]) for i in comment: honor20i_text=open('D:\\python_data\\honor20i_text.txt' ,'a' ) honor20i_text.write('%s\n' %i['content' ]) honor20i_text.close()
此时运行程序会在指定目录下生成一个txt文件,打开可看见即为我们获取到的评论数据,看起来有点乱,可以在请求的时候自己做一下格式美化,后面我要将获取到的txt数据可视化(词云),所以这里就不用做美化了啊
数据可视化(词云形式,激动ヾ(✿゚▽゚)ノ) 同样先导包
1 2 3 import jiebafrom wordcloud import WordCloudimport matplotlib.pyplot as plt
下面读取我们获取到的txt文件内容,再使用jieba来处理剪切我们爬取的文本内容,继续处理对剪过的文本以空格拼接起来,然后就是利用matplotlib包设置一下显示的字体样式和保存显示结果了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 import jieba from wordcloud import WordCloud import matplotlib.pyplot as plt file_text = open('D:\\python_data\\honor20i_text.txt' ,'r' ).read() cut_text = jieba.cut(file_text) result = " " .join(cut_text) wc_cloud = WordCloud( font_path='D:\python_data\\pzh.ttf' , background_color='black' , width=1200 , height=600 , max_font_size=150 , min_font_size=30 , max_words=10000 ) wc_cloud.generate(result) wc_cloud.to_file('D:\\python_data\\LingDucloud.png' ) plt.figure('凌度img' ) plt.title('JD_mate20' ) plt.imshow(wc_cloud) plt.axis('off' ) plt.show()
注意这里用到了.ttf字体包,没有字体包生成的图片是火星文哦😂😂需要字体包的,可以到微信公众号 编程之外 输入关键词“字体包 ”免费获取,欢迎小伙伴入坑哦!😁😁😁
1 font_path='D:\python_data\\pzh.ttf'
如下为运行后的可视化词云效果,字体越大越明显的词汇说明在评论内容中出现的次数就越多,此时在指定的路径目录下也会生成相应的图片
下面为全部源码,将数据获取和数据可视化分别写成两个方法,在main中分别调用就不用新建两个python文件啦。哪里还不太懂,或者有什么问题(包括和我获取.ttf字体包)欢迎在留言区留下你的脚印哦。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 import requestsimport jsondef gain_data () : headers={ 'referer' :'Referer: https://item.jd.com/100003060627.html' , 'user-agent' :'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36' } url_header="https://sclub.jd.com/comment/productPageComments.action?callback=" \ "fetchJSON_comment98vv19450&productId=100003060627&score=0&sortType=5&page=" for page in range(20 ): url_tail="&pageSize=10&isShadowSku=0&rid=0&fold=1" url_mate20=url_header + str(page+1 ) + url_tail res=requests.get(url_mate20,headers=headers) data=json.loads(res.text[27 :-2 ]) comment=(data['comments' ]) for i in comment: honor20i_text=open('D:\\python_data\\honor20i_text.txt' ,'a' ) honor20i_text.write('%s\n' %i['content' ]) honor20i_text.close() def mate20_view () : import jieba from wordcloud import WordCloud import matplotlib.pyplot as plt file_text = open('D:\\python_data\\honor20i_text.txt' ,'r' ).read() cut_text = jieba.cut(file_text) result = " " .join(cut_text) wc_cloud = WordCloud( font_path='D:\python_data\\pzh.ttf' , background_color='black' , width=1200 , height=600 , max_font_size=150 , min_font_size=30 , max_words=10000 ) wc_cloud.generate(result) wc_cloud.to_file('D:\\python_data\\LingDucloud.png' ) plt.figure('凌度img' ) plt.title('JD_mate20' ) plt.imshow(wc_cloud) plt.axis('off' ) plt.show() if __name__ == '__main__' : mate20_view()
文章到这里就结束啦,感谢参考:https://www.jb51.net/article/154261.htm https://blog.csdn.net/weixin_42946604/article/details/88079475
编程之外 这是一篇很基础的关于python爬虫的博客文章,大佬看见了一定要在评论区留下宝贵的建议脚印呀!大二的时候就学习过Python这方面的知识了,那时候没什么兴趣,就没有好好学┭┮﹏┭┮,现在也是还在自学中,也看了很多大佬的文章,受益匪浅。最后告诉一下小同学,如果是计算机类、编程类专业并且要走专业路线的话,一定要好好学习数学,今后的人工智能、大数据、数据建模你将会感受到数学的重要性,说到这里真想给自己两jiao(つД`)过去两年怎么不好好学高数、线性代数、概率论、离散数学和算法 ,精神上再给自己一jiao!