–转自《1900-高级农民工》http://www.makcyun.top

安装并运行pyspider

安装pyspider

pip3 install pyspider

运行pyspider并创建爬虫项目huxiu

pyspider all

成功后,如下图所示:

在浏览器中输入:http://localhost:5000或者http://127.0.0.1:5000

点击Create,输入项目名称,此处不输入Start URLs

爬取数据


爬取代码如下:

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2018-11-22 10:57:04
# Project: huxiufrom pyspider.libs.base_handler import *
import json
from pyquery import PyQuery as pq
import pandas as pd
import pymongo
import time
import numpy as npclient = pymongo.MongoClient('localhost', 27017)
db = client.Huxiu
mongo_collection = db.huxiu_newsclass Handler(BaseHandler):crawl_config = {"headers":{'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36','X-Requested-With': 'XMLHttpRequest'}}def get_taskid(self, task):return md5string(task['url'] + json.dumps(task['fetch'].get('data', '')))def on_start(self):for page in range(2, 50):print('正在爬取第 %s 页' % page)self.crawl('https://www.huxiu.com/v2_action/article_list', method='POST', data={'page':page}, callback=self.index_page)def index_page(self, response):content = response.json['data']doc = pq(content)lis = doc('.mod-art').items()data = [{'title':item('.msubstr-row2').text(),'url':'https://www.huxiu.com'+str(item('.msubstr-row2').attr('href')),'name':item('.author-name').text(),'write_time':item('.time').text(),'comment':item('.icon-cmt+em').text(),'favorites':item('.icon-fvr+em').text(),'abstract':item('.mob-sub').text()}for item in lis]print(data)return datadef on_result(self, result):if result:self.save_to_mongo(result)def save_to_mongo(self, result):df = pd.DataFrame(result)content = json.loads(df.T.to_json()).values()if mongo_collection.insert_many(content):print('存储到mongodb成功')sleep = np.random.randint(1,5)time.sleep(sleep)

查看数据

由于只用于学习,此处只爬取50页数据。
打开Studio 3T,查看爬取到的数据。

爬取数据分析

# -*- encoding: utf-8 -*-import pymongo
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import re
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
import jieba
import os
from PIL import Image
from os import pathplt.style.use('ggplot')
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
fig = plt.figure(figsize=(8,5))
axl = fig.add_subplot(1,1,1)
colors = '#6D6D6D' # 设置标题颜色为灰色
color_line = '#CC2824'
fontsize_title = 20
fontsize_text = 10# 数据清洗处理
def parse_huxiu():client = pymongo.MongoClient(host='localhost', port=27017)db = client['Huxiu']collection = db['huxiu_news']# 将数据库数据转为dataFramedata = pd.DataFrame(list(collection.find()))# 删除无用的_id列data.drop(['_id'], axis=1, inplace=True)# 删除特殊符号©data['name'].replace('©','',inplace=True,regex=True)data_duplicated = data.duplicated().value_counts()# 删除重复值data = data.drop_duplicates(keep='first')# 将数据列改为数值列data = data.apply(pd.to_numeric, errors='ignore')# 修改时间,并转换为datetime格式data['write_time'] = data['write_time'].replace('.*前', '2018-10-31', regex=True)data['write_time'] = pd.to_datetime(data['write_time'])data = data.reset_index(drop=True)# 增加标题长度列data['title_length'] = data['title'].apply(len)# 年份列data['year'] = data['write_time'].dt.yearreturn data# 数据分析部分
def analysis1(data):data.set_index(data['write_time'], inplace=True)data = data.resample('Q').count()['name'] # 以季度汇总data = data.to_period('Q')# 创建x,y轴标签x = np.arange(0, len(data), 1)axl.plot(x, data.values,color = color_line,marker = 'o', markersize = 4)axl.set_xticks(x) # 设置x轴标签为自然数序列axl.set_xticklabels(data.index) # 更改x轴标签值为年份plt.xticks(rotation=90) # 旋转90度,不至于太拥挤for x,y in zip(x,data.values):plt.text(x,y + 10, '%.0f' %y,ha = 'center', color = colors, fontsize=fontsize_text)# 设置标题及横纵坐标轴标题plt.title('虎嗅网文章数量发布变化(2012-2018)', color = colors, fontsize=fontsize_title)plt.xlabel('时期')plt.ylabel('文章(篇)')plt.tight_layout() # 自动控制空白边缘plt.savefig('虎嗅网文章数量发布变化.png', dip=200)plt.show()data = parse_huxiu()
# analysis1(data)# 2 文章收藏量分析
def analysis2(data):def topn(data):top = data.sort_values('favorites', ascending=False)return top[:3]data = data.groupby(by=['year']).apply(topn)print(data[['title', 'favorites']])# 增加每年top123列,列依次值为1、2、3data['add'] = 1 # 辅助data['top'] = data.groupby(by='year')['add'].cumsum()data_reshape = data.pivot_table(index='year', columns='top', values='favorites').reset_index()print(data_reshape)data_reshape.plot(y = [1,2,3],kind = 'bar',width = 0.3,color = ['#1362A3', '#3297EA', '#8EC6F5'])# 添加x轴标签years = data['year'].unique()plt.xticks(list(range(7)), years)plt.xlabel('Year')plt.ylabel('文章收藏数量')plt.title('历年TOP3文章收藏比较', color = colors, fontsize = fontsize_title)plt.tight_layout()plt.savefig('历年TOP3文章收藏比较.png', dpi=200)plt.show()# analysis2(data)# 3 发文最多的媒体 top20
def analysis3(data):data = data.groupby(data['name'])['title'].count()data = data.sort_values(ascending=False)print(data)# pandas 直接绘制,invert_yaxis()颠倒顺序data[1:21].plot(kind='barh',color=color_line).invert_yaxis()for y,x in enumerate(list(data[1:21].values)):plt.text(x+12,y+0.2,'%s' %round(x,1),ha='center',color=colors)plt.xlabel('文章数量')plt.ylabel('作者')plt.title('发文数量最多的TOP20作者', color = colors, fontsize=fontsize_title)plt.tight_layout()plt.savefig('发文数量最多的TOP20作者.png',dpi=200)plt.show()# analysis3(data)# 发文超过至少5篇以上的作者的文章平均收藏数排名
def analysis4(data):data = pd.pivot_table(data,values=['favorites'],index='name',aggfunc=[np.sum,np.size])data['avg'] = data[('sum','favorites')]/data[('size','favorites')]# 平均收藏数取整# data['avg'] = data['avg'].round(decimals=1)data['avg'] = data['avg'].astype('int')# flatten 平铺列data.columns = data.columns.get_level_values(0)data.columns = ['total_favorites','ariticls_num','avg_favorites']# 筛选出文章数至少5篇的data=data.query('ariticls_num > 4')data = data.sort_values(by=['avg_favorites'],ascending=False)print(data[:10])print(data[-10:])# analysis4(data)
# print(data.dtypes)# 5 收藏和评论的分布直方图
def analysis5(data):sns.distplot(data['favorites'])plt.tight_layout()# plt.title('收藏和评论的分布直方图', color = colors, fontsize=fontsize_title)# plt.savefig('收藏和评论的分布直方图.png',dpi=200)plt.show()# analysis5(data)# 6 散点图查看收藏和评论数的关系,发现个别异常
def analysis6(data):plt.scatter(data['favorites'], data['comment'], s=8, color='#1362A3')plt.xlabel('文章收藏量')plt.ylabel('文章评论数')plt.title('文章评论数与收藏量关系', color = colors, fontsize=fontsize_title)plt.tight_layout()plt.savefig('文章评论数与收藏量关系.png', dpi=200)plt.show()# analysis6(data)# 7 查看标题长度与收藏量的关系
def analysis7(data):plt.scatter(x=data['favorites'],y=data['title_length'],s=8,)plt.xlabel('文章收藏量')plt.ylabel('文章标题长度')plt.title('文章收藏量和标题长度关系', color = colors, fontsize=fontsize_title)plt.tight_layout()plt.savefig('文章收藏量和标题长度关系.png', dpi=200)plt.show()# analysis7(data)# 8 查看标题长度与收藏量和评论数之间的关系
def analysis8(data):plt.scatter(x=data['favorites'],y=data['comment'],s=data['title_length']/2,)plt.xlabel('文章收藏量')plt.ylabel('文章评论数')plt.title('文章标题长度与收藏量和评论数之间的关系', color = colors, fontsize=fontsize_title)plt.tight_layout()plt.savefig('文章标题长度与收藏量和评论数之间的关系.png', dpi=200)plt.show()# analysis8(data)# 9 词云
def analysis9(data):jieba.load_userdict("userdict.txt")jieba.add_word('区块链')text=''for i in data['title'].values:# for i in data[data.year == 2018]['title'].values:# 替换无用字符symbol_to_replace = '[!"#$%&\'()*+,-./:;<=>?@,。?★、…【】《》?“”‘’![\\]^_`{|}~]+'# data['name'].str.replace(symbol_to_replace,'',inplace=True,regex=True)i = re.sub(symbol_to_replace,'',i)# print(i)text+=' '.join(jieba.cut(i,cut_all=False))# text = jieba.del_word('如何')d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()background_Image = np.array(Image.open(path.join(d, "tiger.jpg")))# background_Image = plt.imread('./tiger.jpg')font_path = 'C:\Windows\Fonts\simhei.ttf'  # 思源黑,黑体simhei.ttf# 添加stopswordsstopwords = set()# 先运行对text进行词频统计再排序,再选择要增加的停用词stopwords.update(['如何','怎么','一个','什么','为什么','还是','我们','为何','可能','不是','没有','哪些','成为','可以','背后','到底','就是','这么','不要','怎样','为了','能否','你们','还有','这样','这个','真的','那些'])wc = WordCloud(# background_color = '#3F3F3F',# background_color = 'white',background_color = 'black',font_path = font_path,mask = background_Image,stopwords = stopwords,max_words = 200,# width = 1000,height=600,margin =2,max_font_size = 100,random_state = 42,scale = 2,# colormap = 'viridis')wc.generate_from_text(text)process_word = WordCloud.process_text(wc, text)# 下面是字典排序sort = sorted(process_word.items(),key=lambda e:e[1],reverse=True) # sort为listprint(sort[:50])  # 输出前词频最高的前50个,然后筛选出不需要的stopwords,添加到前面的stopwords.update()方法中img_colors = ImageColorGenerator(background_Image)wc.recolor(color_func=img_colors)  # 颜色跟随图片颜色plt.imshow(wc,interpolation='bilinear')plt.axis('off')plt.tight_layout()  # 自动控制空白边缘,以全部显示x轴名称plt.savefig('huxiu5.png',dpi=200)plt.show()
analysis9(data)# 10 绘制标题形式饼图
def analysis10(data):data1 = data[data['title'].str.contains("(.*\?.*)|(.*\?.*)")]data2 = data[data['title'].str.contains("(.*\!.*)|(.*\!.*)")]# 带有问号的标题数量quantity1 = data1.shape[0]# 带有叹号的标题数量quantity2 = data2.shape[0]# 剩余数量quantity = data.shape[0] - data1.shape[0] - data2.shape[0]sizes = [quantity2,quantity1,quantity]labels = [u'叹号标题',u'问号标题',u'陈述性标题']colors_pie = ['#1362A3','#3297EA','#8EC6F5'] #每块颜色定义explode = [0,0.05,0]plt.pie(sizes,autopct='%.1f%%',labels= labels,colors =colors_pie,shadow = False, #无阴影设置startangle =90, #逆时针起始角度设置explode = explode,# textprops={'fontsize': 14, 'color': 'w'} # 设置文字颜色textprops={'fontsize': 12, 'color': 'w'} # 设置文字颜色)plt.title('三分之一文章的标题喜欢用问号',color=colors,fontsize=fontsize_title)plt.axis('equal')plt.axis('off')plt.legend(loc = 'upper right')plt.tight_layout()  # 自动控制空白边缘,以全部显示x轴名称plt.savefig('title问号.png',dpi=200)plt.show()# analysis10(data)








【Python3 爬虫学习笔记】用PySpider爬取虎嗅网并进行文章分析相关推荐

  1. Python3 爬虫学习笔记 C03 【Ajax 数据爬取】

    Python3 爬虫学习笔记第三章 -- [Ajax 数据爬取] 文章目录 [3.1]Ajax 简介 [3.2]解析真实地址提取 [3.1]Ajax 简介 Ajax - Asynchronous Ja ...

  2. Python3 爬虫学习笔记 C18【爬虫框架 pyspider — 深入理解】

    Python3 爬虫学习笔记第十八章 -- [爬虫框架 pyspider - 深入理解] 文章目录 [18.1]启动参数 [18.2]运行单个组件 [18.2.1]运行 Scheduler [18.2 ...

  3. Python3 爬虫学习笔记 C17【爬虫框架 pyspider — 基本使用】

    Python3 爬虫学习笔记第十七章 -- [爬虫框架 pyspider - 基本使用] 文章目录 [17.1]初识 pyspider [17.2]使用 pyspider [17.2.1]主界面 [1 ...

  4. Python3 爬虫学习笔记 C10【数据储存系列 — MySQL】

    Python3 爬虫学习笔记第十章 -- [数据储存系列 - MySQL] 文章目录 [10.1]MySQL 基本操作语句 数据库操作 表操作 表的结构 表的数据 [10.2]Python 连接 My ...

  5. Python3 爬虫学习笔记 C09【数据储存系列 — 文件储存】

    Python3 爬虫学习笔记第九章 -- [数据储存系列 - 文件储存] 文章目录 [9.1]TXT 文本存储 [9.1.1]基本示例 [9.1.2]打开方式 [9.2]JSON 文件存储 [9.2. ...

  6. Python3 爬虫学习笔记 C04 【自动化测试工具 Selenium】

    Python3 爬虫学习笔记第四章 -- [自动化测试工具 Selenium] 文章目录 [4.1]下载驱动 [4.2]声明浏览器对象 [4.3]访问页面 [4.4]启动参数 [4.5]查找节点 [4 ...

  7. Python3 爬虫学习笔记 C01 【基本库 urllib 的使用】

    Python3 爬虫学习笔记第一章 -- [基本库 urllib 的使用] 文章目录 [1.1] urllib 简介 [1.2] urllib.request 发送请求 [1.2.1] urllib. ...

  8. 爬虫学习(一)---爬取电影天堂下载链接

    欢迎加入python学习交流群 667279387 爬虫学习 爬虫学习(一)-爬取电影天堂下载链接 爬虫学习(二)–爬取360应用市场app信息 主要利用了python3.5 requests,Bea ...

  9. Python3 爬虫学习笔记 C08【解析库 Beautiful Soup】

    Python3 爬虫学习笔记第八章 -- [解析库 Beautiful Soup] 文章目录 [8.1]关于 Beautiful Soup [8.2]Beautiful Soup 的基本使用 [8.3 ...

最新文章

  1. SQL:找出我(uid=2)所有的好友信息,和这些好友发布的最新的一篇文章
  2. NYOJ 642 牛奶
  3. word中安装MathType
  4. boost::geometry::detail::overlay::get_relative_order用法的测试程序
  5. go 关闭通道的必要性
  6. Redis 实践笔记1---基础知识
  7. java如何添加同名的xml节点_jaxb怎么解析多个同名元素
  8. Jquery页面跳转
  9. Objective-C与Swift下的自定义打印函数(Debug和Release)
  10. 浅谈Mysql底层索引原理
  11. 为什么要有红黑树?什么是红黑树?
  12. 微信内置浏览器打开所有页面空白解决方案
  13. 大数据是什么?初学者怎样理解大数据技术
  14. linux vi 替换
  15. 草莓 西瓜 柚子……
  16. Word如何插入图片?最全方法总结(2023新版)
  17. 简述DDNS和DNS区别
  18. Jquery如何获取当前元素的id?
  19. jsp超市会员积分管理系统
  20. 金仓数据库 时间没有 时分秒 的问题

热门文章

  1. Redis缓存技术-运维篇
  2. Python图像批处理(图像非监督分类)
  3. 报错W: APT had planned for dpkg to do more than it reported back (9 vs 16).解决方式
  4. 使用server版的哈工大LTP进行NLP任务(Java实现)
  5. Skype登陆Windows Live Messenger,你更爱哪个?
  6. 软件工程头歌软件测试(实验五)软件项目管理(实验六)
  7. 嫌得蛋疼做了个接鸡蛋
  8. 利用Open 3D建立三维模型
  9. 【Rhapsody学习笔记(三)】常用通讯点
  10. 火灾自动报警系统施工及验收规范