Python Scrapy框架爬取微博数据

-1.前言

  最近导师接到了一个项目,要爬取社交网路的数据,其中有一部分是爬取微博,Twitter和Facebook.目前实现了微博部分.先写着.

整个工程是使用的python3.6+Scray框架+MySQL数据库.

整个项目是在一个github开源的项目的基础上进行修改.

由于整个项目具有保密性,所以源码就不能放出了,下面和大家交流思路.

未完待续,有空我就会更新一下.

0.总体思路

主要是通过weibo.cn这个站去爬取.这个也是网上的大佬们最常用的方式.

首先分析一下为什么这么做:

首先,新浪微博的API已经是个废的了,不用再考虑了.

新浪微博目前存在三个站点 weibo.cn(最老的站),m.weibo.com(目前手机端的站),weibo.com(PC端的站).这三个站的爬取难度由低到高.后两个站都是动态加载的,想要爬取就要模拟浏览器的下滑动作(不过也可以判断分页问题,但这样速度就很慢了),而且评论也是动态加载的,这就导致爬取难度很大.(至少对于我这个新手来说)

再者,这个站访问的页面都是有规律可循的,所以难度就降低了.

上面是优点.

缺点就是这个站能够爬取的信息不足,一是无法获取爬取用户的点赞别人的微博,二是无法获取全部的粉丝/关注列表(另外两个站限制的更多)

总体上爬取的相关信息如下:

1.个人信息

2.粉丝列表(最近200位)

3.关注列表(最近200位)

Python Scrapy框架爬取微博数据_第1张图片

4.指定用户的所有微博

5.单条微博的点赞/转发/评论数

6.单条微博下的所有评论(包括评论者的UID)

1.技术描述

  首先是使用的编程环境: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

2.数据爬取

首先你要获取到你访问用户的UID,这个就不描述了.

然后构成最初是的请求:

yield Request(url="https://weibo.cn/%s/info" % uid, callback=self.parse_information)

parse_information 为下一个函数,主要是完成个人信息的抓取

然后在个人信息列表点击微博,可以看到个人的单条微博是有固定格式的url,评论以及粉丝等等都是,再通过网页解析的方式获取相关信息(可以用requests , bs4 + urllib等等)

3.具体问题

如果有具体想了解的可以评论区交流,由于项目保密性,所以无法贴出代码.

你可能感兴趣的:(Anaconda,Python,Scrapy)