最近导师接到了一个项目,要爬取社交网路的数据,其中有一部分是爬取微博,Twitter和Facebook.目前实现了微博部分.先写着.
整个工程是使用的python3.6+Scray框架+MySQL数据库.
整个项目是在一个github开源的项目的基础上进行修改.
由于整个项目具有保密性,所以源码就不能放出了,下面和大家交流思路.
未完待续,有空我就会更新一下.
主要是通过weibo.cn这个站去爬取.这个也是网上的大佬们最常用的方式.
首先分析一下为什么这么做:
首先,新浪微博的API已经是个废的了,不用再考虑了.
新浪微博目前存在三个站点 weibo.cn(最老的站),m.weibo.com(目前手机端的站),weibo.com(PC端的站).这三个站的爬取难度由低到高.后两个站都是动态加载的,想要爬取就要模拟浏览器的下滑动作(不过也可以判断分页问题,但这样速度就很慢了),而且评论也是动态加载的,这就导致爬取难度很大.(至少对于我这个新手来说)
再者,这个站访问的页面都是有规律可循的,所以难度就降低了.
上面是优点.
缺点就是这个站能够爬取的信息不足,一是无法获取爬取用户的点赞别人的微博,二是无法获取全部的粉丝/关注列表(另外两个站限制的更多)
总体上爬取的相关信息如下:
1.个人信息
2.粉丝列表(最近200位)
3.关注列表(最近200位)
4.指定用户的所有微博
5.单条微博的点赞/转发/评论数
6.单条微博下的所有评论(包括评论者的UID)
首先是使用的编程环境:Windows 10 + pycharm 2018.2.4 + Anaconda3 + Python 3.6.6 +Scrapy 1.5.1 + (Mysql 5.7.23 + SQLyog Community 64)
关于 pycharm 和 Anaconda3 的相关配置请自行百度完成后,记得换源,不然后面conda一些环境的时候会非常痛苦.
关于 Scrapy 框架的安装可以参考《Python 3网络爬虫开发实战》,里面第一章爬虫环境的搭建.同时记得装上pysql.
PS:网上有很多人用的MongoDB,但是我是感觉也就Python写代码的是方便点,资源还是比较少(尤其是,我需要做简单的有界面的数据展示,以前本科是用C#做项目的,研究了很久的MongoDB的dll是真的很难受.最后还是换成了MySQL)
主要的思路就是模拟浏览器登录,然后获取Cookies.由此构成请求头.通过登陆过的页面去访问个人微博,获取相关信息.
1.1 模拟登陆
主要使用selenium去获取控件的相关信息,并且输入用户名和密码,进行点击登录操作,一般还会出现验证码的问题,可以获取到验证码的控件,截取图像,对图像进行对比,然后完成验证码的问题.
ps 如果是个人使用,数据量不大的情况,可以手动的去浏览器的控制台中(一般是F12)去找到cookies.
1.2 scrapy框架设置
配置都在setting.py中
首先是随机请求头的问题,这里有部分可以参考:
USER_AGENT_LIST = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]
同时需要在DOWNLOADER_MIDDLEWARES属性中加入如下代码:
'sina.middlewares.RandomUserAgentMiddleware': 400
首先你要获取到你访问用户的UID,这个就不描述了.
然后构成最初是的请求:
yield Request(url="https://weibo.cn/%s/info" % uid, callback=self.parse_information)
parse_information 为下一个函数,主要是完成个人信息的抓取
然后在个人信息列表点击微博,可以看到个人的单条微博是有固定格式的url,评论以及粉丝等等都是,再通过网页解析的方式获取相关信息(可以用requests , bs4 + urllib等等)
如果有具体想了解的可以评论区交流,由于项目保密性,所以无法贴出代码.