一、起因

最近几天陈情令大火,而#肖战#王一博等人也成为众人所熟知的对象,所以我想用Scrapy爬取演员的微博信息来分析下演员信息

二、 目标

本次爬取的目标是X玖少年团肖战DAYTOY的公开基本信息,如用户昵称、头像、用户的关注、粉丝列表以及发布的微博等,这些信息抓取之后保存至Mysql,并绘制出图表

三、准备工作

请确保代理池、Cookies池已经实现并可以正常运行,安装Scrapy、PyMysql库。这里我新注册了四个微博账号,防止爬虫被封

四、爬取思路

其实使用Requests+BeautifulSoup可以很灵活的对微博进行爬取,但因为是单线程,并发效率不高,爬取的速度很慢,所以使用Scrapy+XPath可以很高效的爬取

首先我们要实现对X玖少年团肖战DAYTOY的爬取。这里采用的爬取方式是,以用户的URL为起始点,爬取他发表的微博的内容、时间、转发数、评论数、点赞数,并通过Item管道输出至Mysql数据库,然后将数据绘制成图表

五、爬取分析

新浪微博一共有三个站点:weibo.cn,m.weibo.cn,weibo.com,相对应的爬取难度也依次变高,所以为了降低爬取难度,这里我们选取的爬取站点是:https://weibo.cn,此站点是微博移动端的站点。打开该站点会跳转到登录页面,这是因为主页做了登录限制。不过我们可以用cookie绕过登录限制,直接打开某个用户详情页面,此处打开X玖少年团肖战DAYTOY的微博,链接为:https://weibo.cn/u/1792951112,即可进入其个人详情页面,如下图所示。

以下是我们需要爬取的信息

六、创建爬虫

  • 接下来我们用Scrapy来实现这个抓取过程。首先创建一个项目,命令如下所示:
scrapy startproject weibo

  • 进入项目中,新建一个Spider,名为weibocn,命令如下所示:
scrapy genspider weibocn weibo.cn

七、创建Items

class WeiboItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()text_fanart = scrapy.Field()    #原创内容text_transfrom = scrapy.Field() #转发内容comment = scrapy.Field()    #评论数like = scrapy.Field()   #点赞数transmit = scrapy.Field()   #转发数time = scrapy.Field()   #发表时间_from = scrapy.Field()    #来自的客户端

八、编写spider

class WeibocnSpider(scrapy.Spider):name = 'weibocn'allowed_domains = ['weibo.cn']url = 'https://weibo.cn/u/1792951112?page={page}'# start_urls = ['https://weibo.cn/u/1792951112']def transform(self, cookies):cookie_dict = {}cookies = cookies.replace(' ', '')list = cookies.split(';')for i in list:keys = i.split('=')[0]values = i.split('=')[1]cookie_dict[keys] = valuesreturn cookie_dict#Override start_requests()#此方法相当于 requests.get()方法def start_requests(self):for page in range(1,65):yield scrapy.Request(url=self.url.format(page=page),callback=self.parse)# 此方法中的response相当于response = requests.get()def parse(self, response):# print(response.text)item = WeiboItem()for p in response.xpath("//div[@class='c'and @id]"):try:text_transfrom = "".join(p.xpath("./div/text()").re(r'[\u4e00-\u9fa5]'))text_fanart = "".join(p.xpath("./div/span[@class='ctt']/text()").extract())item['text_fanart'] = text_fanartitem['text_transfrom'] = text_transfromitem['like'] = "".join(p.xpath("./div/a").re(r'赞\[[0-9]*?\]')).replace('赞[','').replace(']','')item['transmit'] = "".join(p.xpath("./div/a").re(r'转发\[[0-9]*?\]')).replace('转发[', '').replace(']', '')item['comment'] = "".join(p.xpath("./div/a").re(r'评论\[[0-9]*?\]')).replace('评论[', '').replace(']', '')time_from = "".join(p.xpath("./div/span[@class='ct']/text()").extract()).split("\xa0来自")item['time'] = time_from[0]item['_from'] = time_from[1]yield itemexcept Exception as e:print(e)continue

九、数据清洗

有些微博的时间可能不是标准的时间,比如它可能显示为刚刚、几分钟前、几小时前、昨天等。这里我们需要统一转化这些时间,实现一个方法,代码如下所示:

    def clear_date(self,publish_time):if "刚刚" in publish_time:publish_time = datetime.now().strftime('%Y-%m-%d %H:%M')elif "分钟" in publish_time:minute = publish_time[:publish_time.find("分钟")]minute = timedelta(minutes=int(minute))publish_time = (datetime.now() - minute).strftime("%Y-%m-%d %H:%M")elif "今天" in publish_time:today = datetime.now().strftime("%Y-%m-%d")time = publish_time.replace('今天', '')publish_time = today + " " + timeelif "月" in publish_time:year = datetime.now().strftime("%Y")publish_time = str(publish_time)publish_time = year + "-" + publish_time.replace('月', '-').replace('日', '')else:publish_time = publish_time[:16]return publish_time

十、编写pipelines

class WeiboPipeline(object):def __init__(self):#创建连接self.conn = pymysql.connect('localhost','root','root','sina')#创建游标self.cursor = self.conn.cursor()#管道处理,将数据存入mysqldef process_item(self, item, spider):sql = "INSERT INTO weibocn(text_fanart,text_transfrom,comment,`like`,transmit,`time`,`from`) VALUES (%s,%s,%s,%s,%s,%s,%s)"print('==================================')self.cursor.execute(sql,(item['text_fanart'],item['text_transfrom'],item['comment'],item['like'],item['transmit'],item['time'],item['_from']))self.conn.commit()return item#关闭sqldbdef close_spider(self,spider):self.cursor.close()self.conn.close()

十一、开启管道

进入settings.py文件中启用管道

ITEM_PIPELINES = {'weibo.pipelines.WeiboPipeline': 300
}

十二、运行scrapy

scrapy crawl weibocn

运行结果如下图:

十三、数据库插入报错InternalError: (pymysql.err.InternalError) (1366, "Incorrect string value: '\\xE6\\xAD

解决方法:https://blog.csdn.net/sinat_41721615/article/details/94979429

十四、绘制图表

这里使用的matplotlib库做出的图,没有审美天赋,所以做出来的图比较丑

import csv
import matplotlib.pyplot as plt
import numpy as np
file = open('weibocn.csv','r')
reader = csv.reader(file)
comment_list = []
like_list = []
transmit_list = []
time_list = []
for comment,like,transmit,time in reader:comment_list.append(comment)like_list.append(like)transmit_list.append(transmit)time_list.append(time)
x = time_list
label = ['评论数','点赞数','转发数']
color = ['red','blue','green']
list = []
list.append(comment_list)
list.append(like_list)
list.append(transmit_list)
for i in range(3):plt.plot(x,list[i],c=color[i],label=label[i])
#设置轴标签
plt.xlabel('weibo time shaft')
plt.ylabel('weibo count')
plt.title('肖战微博流量情况')
#设置刻度#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#显示多图例legend
plt.legend()
#显示图
plt.show()

绘制图表是最头疼的地方,希望有会作图的小伙伴可以优化一下我做出来的图,并在评论区留言,小弟不胜感激!

github项目地址:https://github.com/jlysh/weibocn

Scrapy爬取新浪微博#陈情令相关推荐

  1. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(四) —— 应对反爬技术(选取 User-Agent、添加 IP代理池以及Cookies池 )

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) -- 数据的持久化--使用MongoDB存储爬取的数据 最近项目有些忙,很多需求紧急上线,所以一直没能完善< 使用 ...

  2. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(二) —— 编写一个基本的 Spider 爬取微博用户信息

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(一) -- 新建爬虫项目 在上一篇我们新建了一个 sina_scrapy 的项目,这一节我们开始正式编写爬虫的代码. 选择目标 ...

  3. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) —— 数据的持久化——使用MongoDB存储爬取的数据

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(二) -- 编写一个基本的 Spider 爬取微博用户信息 在上一篇博客中,我们已经新建了一个爬虫应用,并简单实现了爬取一位微 ...

  4. python 制作高斯mask_Python3 练手项目: 抓取豆瓣陈情令评论,并制作词云图

    (点击上方公众号,可快速关注一起学Python) 链接: https://blog.csdn.net/weixin_43930694/article/details/98334465 一.项目简介 1 ...

  5. powerbi python词云图_Python 练手项目: 抓取豆瓣陈情令评论,并制作词云图

    一.项目简介 1.内容:循环抓取豆瓣影评中所有观众对<陈情令>的评论,存储在文本文档中,并运用可视化库--词云对其进行分析. 2.目标网站: https://movie.douban.co ...

  6. Scrapy爬取新浪微博用户粉丝数据

    一般来说pc端的信息是最为全面的,但是防范措施也是最严格的.所以不能走weibo.com这个域名下进行爬取,新浪微博在pc端的反扒措施较为全面.而手机端的数据则相对好爬取,而且数据都是Json格式,解 ...

  7. Scrapy爬取新浪微博用户信息、用户微博及其微博评论转发

    项目介绍 新浪微博是国内主要的社交舆论平台,对社交媒体中的数据进行采集是舆论分析的方法之一. 本项目无需cookie,可以连续爬取一个或多个新浪微博用户信息.用户微博及其微博评论转发. 实例 选择爬取 ...

  8. Scrapy框架的使用之Scrapy爬取新浪微博

    前面讲解了Scrapy中各个模块基本使用方法以及代理池.Cookies池.接下来我们以一个反爬比较强的网站新浪微博为例,来实现一下Scrapy的大规模爬取. 一.本节目标 本次爬取的目标是新浪微博用户 ...

  9. Python3网络爬虫开发实战,Scrapy 爬取新浪微博

    前面讲解了 Scrapy 中各个模块基本使用方法以及代理池.Cookies 池.接下来我们以一个反爬比较强的网站新浪微博为例,来实现一下 Scrapy 的大规模爬取. 很多人学习python,不知道从 ...

最新文章

  1. R语言使用upper.tri函数、lower.tri函数、diag函数改变matrix矩阵上三角形、下三角形、对角线的数值
  2. Java开发人员 2019 生态系统信息图
  3. 在linux中安装软件会出的问题,linux中安装程序出现的问题
  4. 学会了selenium 模拟鼠标操作,你就可以偷懒点点点了
  5. Java常用集合笔记
  6. CCI指标详解及实战用法
  7. win32实现两个透明窗口联动
  8. android 优秀项目,11个优秀的Android开发开源项目
  9. 词频统计 matlab,5年cvpr论文词频分析,今年最火词——深度学习
  10. 电机对应的电流计算方式及电线、端子的选型
  11. Python+OpenCV人脸识别签到考勤系统
  12. 路径规划—— A* 算法
  13. 安猪瀚的一家之言:多读书,多看报,少吃零食,多睡觉
  14. 零基础可以报原画班么?原画培训坑不坑?
  15. “特别难”的外卖运营,如今有了免费管家
  16. 微信小程序跨域关于跨域和 Ajax 的说明
  17. Autojs+VSCode 的基本使用
  18. 互联网电商大数据环境 ——大数飓数据分析实践培训精华笔记(八)——电商核心业务知识之订单商品模块三
  19. qt XML文件中node的删除方法
  20. Windows的批处理(bat)脚本

热门文章

  1. 2020年学习计划(优化的计划制定)
  2. 【vue】增删查改练习
  3. 80后的超彪悍省钱术
  4. oracle数据库 —— 分页查询 java代码实现
  5. Android App点击home键返回桌面,点击图标后重回首页
  6. 复工后,我终于接到 “诈骗电话” 了!
  7. Linux 面试题(史上最全面试题,精心整理100家互联网企业,面试必过)
  8. ZFS管理手册:第三章ZIL
  9. 数字类型以及类型转换
  10. Foxit 修复PDF阅读器中的多个代码执行漏洞