scrapy(2)——scrapy爬取新浪微博(单机版)
Sina爬虫教程
- Scrapy环境搭建
环境:window10 + python2.7(包含scrapy)+ mongoDB
1.1 安装集成了python2.7的anaconda
anaconda下载链接:https://www.continuum.io/downloads
由于scrapy库目前只能在python2.7上使用,请务必确保版本正确,如果已经安装了python3.5,建议使用anaconda_2.7的版本,因为anaconda中集成了python2.7且使用anaconda安装第三库非常方便,所以可以考虑使用anaconda。
anaconda中集成的python务必选择正确,如图1-1所示:
  
图1-1 选择集成python2.7的anaconda
1.2 scrapy库函数的安装
安装scrapy的时候,直接使用conda install scrapy 的命令即可,如图1-2所示:

图1-2 在cmd中安装scrapy库函数
在pycharm中输入import s... 还没有输完IDE就会提示scrapy,则表示scrapy安装成功,如图1-3所示:

图1-3 scrapy库函数安装成功示意图
由于scrapy库函数的使用相对比较麻烦,所以在这里着重对scrapy库函数的使用进行较为详细的解释。
1.3 mongoDB数据库的安装
mongoDB下载地址:https://www.mongodb.com/download-center#community
在下载mongoDB的时候,请选择windows平台,同时对于版本,我们选取了带有SSL的版本,如图1-4所示:

图1-4 mongoDB下载
在启动mongoDB的时候,点击安装之后目录中的mongo.exe即可,如图1-5所示:

图1-5 启动mongoDB
如果出现图1-6所示的情况,则证明mongoDB可以正常使用了:

图1-6 mongoDB正常运行示意图
如果不能出现图1-6所示的情况,而是如1-7中的情况:

图1-7 安装mongoDB报错
如果出现上述的情况或者类似的情况,可能是因为缺少了VC运行环境,建议不要分别安装对应的dll文件,而是建议直接安装VS2017RC。
VS2017RC下载链接:https://www.visualstudio.com/vs/visual-studio-2017-rc/

图1-8 选择安装VS2017RC Community版本的IDE
- scrapy教程
由于scrapy库函数功能比较强大,所以在使用的时候相对比较麻烦,我们就以一个小教程开始这部分的学习。
scrapy的基础入门:http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/tutorial.html
第一步:在pycharm中新建一个名为Dmoz的package,如图2-1所示:
 
 
图2-1 新建一个名为Dmoz的package
第二步:通过cmd进入Dmoz的文件夹,并输入scrapy startproject tutorial指令创建scrapy项目,如图2-2所示:

图2-2 创建scrapy项目
在cmd中输入上述命令并回车之后,就会生成一个树状文件目录,在pycharm可以查看该文件目录,如图2-3所示:

图2-3 生成的树状文件目录
| scrapy.cfg | 项目的配置文件。 | 
| tutorial/ | 该项目的python模块,之后将在此加入代码。 | 
| tutorial/items.py | 项目中的item文件。 | 
| tutorial/pipelines.py | 项目中的pipelines文件 | 
| tutorial/settings.py | 项目的设置文件 | 
| tutorial/spiders/ | 放置spider代码的目录 | 
第三步:定义Item,它用来装在抓取的数据。通过创建一个scrapy.item.item类来声明,定义它的属性为scrapy.item.Field对象,就像一个对象关系映射(ORM)。
我们需要做的是将item模型化,从而控制我们获得url中的数据,比如说我们希望获取待爬取网站的名称、网站的url和网站的描述,这三个索要获取的东西即为我们的域。我们只需要编辑tutorial目录下的items.py文件,修改后的内容如下:
                     
表2-1 items.py文件中的变量含义
| 变量 | 含义 | 
| title | 网站的名称 | 
| link | 网站的url | 
| desc | 网站的描述 | 
第四步:编写爬虫(Spider),它用于从网站爬取数据。
该py文件的位置为:tutorial—spiders—dmoz_spider.py,文件目录如图2-4所示:

图2-4 爬虫py文件的位置
dmoz_spider.py用于从网站上爬取我们需要的信息,它需要继承scrapy.Spider类,该py文件的代码中必须要包含以下内容,如表2-2所示:
 
表2-2 Spider中属性含义
| 属性名称 | 属性含义 | 
| name | Spider的名称,必须唯一 | 
| allowed_domains | 待爬取网站的域名 | 
| start_urls | Spider在启动时进行爬取的url列表 | 
| parse() | Spider的一个方法,用于对response进行接收并解析。 | 
l name的命名(string类型)必须要做到唯一,因为name定义了scrapy如何定位并初始化spider,所以必须唯一。
l allowed_domains包含了spider所允许爬取的域名,以list方式存储;
l start_urls列表的作用是防止没有指定特定的url的时候,spider可以从列表中的url开始进行爬取,第一个被获取到的页面的url将是该列表之一,后续的url将会从获取到的数据中提取;
l parse()方法被调用的时候,每个初始url完成下载后生成的response对象将作为唯一的参数传递给该函数,它会负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的url的request对象。
第五步:爬取网站数据,通过执行scrapy crawl dmoz来启动spider:执行的时候,用cmd跳到爬虫的目录中再执行“scrapy crawl dmoz”,如图2-5所示

图2-5 执行爬取指令
Scrapy为爬虫的 start_urls属性中的每个URL创建了一个 scrapy.http.Request 对象 ,并将爬虫的parse 方法指定为回调函数。 
这些 Request首先被调度,然后被执行,之后通过parse()方法,scrapy.http.Response 对象被返回,结果也被反馈给爬虫。
执行完指令之后,在命令行中会有如下的输出信息,如图2-6所示:

图2-6 日志信息
在这些输出的内容中,包含着scrapy爬虫运行的日志信息。
包含 [dmoz]的那些行,那对应着爬虫的日志。你可以看到start_urls中定义的每个URL(存储在dmoz_spider.py中的start_urls的list中)都有日志行。由于这些URL是起始页面,所以他们没有引用(referrers),所以在每行的末尾你会看到 (referer: <None>)。
	正是因为我们的dmoz_spider.py文件中的parse()方法的存在,在pars()方法的作用下,两个文件被创建(filename = response.url.split("/")[-2]):分别是 Books 和 Resources,这两个文件中有URL的页面内容(f.write(response.body))。
我们将命令行中的日志信息保存下来,这些日志信息可以帮助我们了解爬虫的运行状态,对于分析爬虫具有很大的帮助。
                 
在运行完上述指令之后,在pars()方法的作用下,两个文件被创建(filename = response.url.split("/")[-2]):分别是 Books 和 Resources,这两个文件中有URL的页面内容(f.write(response.body))。 如图2-7所示:

图2-7 生成文件示意图
第六步:提取item。scrapy使用的是XPath selector的机制,这种机制是基于XPath表达式来实现的。
在使用XPath的时候,scrapy中有两种类可供选择,第一种是HtmlXPathSelector(HTML数据解析),第二种是XmlPathSelector(XML数据解析)。
从网页中提取数据有很多方法。Scrapy使用了一种基于 XPath 和 CSS 表达式机制: Scrapy Selectors。
为了介绍Selector的使用方法,接下来我们将要使用内置的 Scrapy shell 。Scrapy Shell需要您预装好IPython。anaconda已经预装了ipython,使用的时候只需要在命令行中输入ipython即可,如图2-8所示:

图2-8 IPython执行示意图
如果使用的不是anaconda,可以从这里下载:ipyhton下载地址
安装了ipython之后,需要进入项目的根目录,执行如图2-9所示的命令来启动shell:

图2-9 启动shell
如果启动失败,可以尝试加上双引号,即 scrapy shell “http://www.dmoz.org/Computers/Programming/Languages/Python/Books/”
将会获得如下的输出:
                
在这里有一些非常重要的信息,如图2-10所示:

图2-10 scrapy object
这些是可用的对象和函数列表。
上述的shell载入之后,我们得到了一个包含response的数据的本地response变量,我们可以输入指令“response.body”查看response的包体,可以输入指令“response.headers”查看response的包头,如图2-11所示:

图2-11 获取的response的包头信息
除了上述两个简单的指令之外,“response.selector”指令对于我们更有意义,如图2-12所示:

图2-12 通过reponse.selector获取用于查询的selector
通过输入response.selector可以获取一个可以用于查询返回数据的selector,以及映射到response.selector.xpath() 、 response.selector.css()的 快捷方法(shortcut): response.xpath() 和 response.css() 。
同时,shell根据response提前初始化了变量sel,该selector能够根据response的类型自动选择最合适的分析规则(XML或者HTML)。
注意在之前图2-10中显示的可用的对象和函数中没有包含sel方法,所以如图2-13所示,如果我们直接使用,会报错,所以改为使用response.xpath()方法,以及与之对应的response.xpath().extract()方法。具体的情况如图2-13所示:

图2-13 使用response.xpath()对response内容进行分析
第七步:提取有用的数据。我们使用response.body可以获取response中的内容,可以通过阅读网页源码选择合适的xpath表达式。
在spider中如果需要引用其他的class,可能会出现保存的情况,如图2-14所示:

图2-14 不能正确引入其他py文件中的class
在这里,虽然导入了正确的class,但是仍然报错,为解决这个问题,首先清除缓存,如图2-15所示:

图2-15 清除缓存
清除缓存之后如果仍然不能恢复,此时需要将整个爬虫文件设置为源目录,如图2-16所示:

图2-16 将爬虫文件目录设置为源目录
修改完之后,使用指令“scrapy crawl dmoz -o items.json”即可将爬取的内容保存为json格式的文件,如图2-17所示:

图2-17 将爬取的内容以json格式保存
3.新浪爬虫
第一步:mongoDB设置
①首先在建立mongoDB所需要的文件夹,如图3-1所示:

图3-1 建立mongoDB需要的文件夹
db文件夹用于存储数据,log文件夹用于存储日志信息,log文件夹中需要新建一个mongoDB.log文件;
bin文件夹是解压的mongoDB文件中的bin文件夹,直接copy过来即可。
②然后cmd跳转到bin文件夹下,执行“mongod --dbpath=D:\databases\mongo\db”,如图3-2所示:

图3-2 配置mongoDB数据的存储位置
这一步的作用是配置mongodb,制定了数据的存储位置,具体的dbpath根据你的db文件夹的位置来设置。
③在浏览器中访问“http://localhost:27017/”,如果出现如图3-3所示的情况,代表mongoDB开启成功。

图3-3 mongoDB开启成功示意图
第二步:新建scrapy项目
①新建一个文件夹,如图3-4所示:

图3-4 新建文件夹用于存储scrapy项目
②在上述的文件夹下执行指令“scrapy crawl Sina_spider1”新建一个scrapy项目,如图3-5所示:

图3-5 新建一个scrapy项目
③在pycharm中将相应配置文件全部写好,并编写spider.py文件用于爬取微博,如图3-6所示:

图3-6 文件树示意图
④在cookies.py中将购买的微博账号全部加进去,防止爬虫被微博识别,由于微博的反扒机制越来越成熟,建议账号在50个左右,多多益善。
⑤在spiders.py中填入你想要爬取的微博ID,如图3-8所示:

图3-8 待爬取微博ID信息
⑥在settings.py中设置合理的间隔时间,建议大于1.5,在这里用的是1.8,如图3-9所示:
 
图3-9 设置合适的间隔时间
⑦在Begin.py中设置用cmdline控制爬虫开始,如图3-10所示:

图3-10 设置cmdline控制爬虫开始爬取指令
⑧用cmd跳入到scrapy文件夹下,执行指令“scrapy crawl sinaSpider”指令,如图3-11所示:

图3-11 执行爬虫
⑨具体的爬虫执行过程可以从shell中看到,如图3-12所示:

图3-12 爬取过程示意图
第三步:用mongoDB可视化工具查看数据
在这里我们选用的是mongobooster,除此之外也可以选用robomongo等工具,但效果大同小异。
在数据库中,存储着Information、Tweets、Follows、Fans四张表,在这些表中,information表和tweets表比较重要。
表1 Information表中字段的含义
| _id | 采用 “用户ID” 作为唯一标识 | 
| Birthday | 出生日期 | 
| City | 城市 | 
| Gender | 性别 | 
| Marriage | 婚姻状况 | 
| NickName | 昵称 | 
| Num_Fans | 粉丝数量 | 
| Num_Follows | 关注数量 | 
| Num_Tweets | 已转发微博数 | 
| Province | 所在省份 | 
| Signature | 签名 | 
| URL | 微博个人主页链接 | 

图3-13 Information表中的数据示意图
表2 Tweets表中字段的含义
| _id | 采用 “用户ID” 作为唯一标识 | 
| Co_oridinates | 发微博时的定位坐标(经纬度) | 
| Comment | 微博被评论的数量 | 
| Content | 微博的内容 | 
| ID | 用户ID | 
| Like | 微博被点赞的数量 | 
| PubTime | 微博发表时间 | 
| Tools | 发微博的工具 | 
| Transfer | 微博被转发的数量 | 

图3-14 Tweets表中的数据示意图
scrapy(2)——scrapy爬取新浪微博(单机版)的更多相关文章
- 爬虫系列5:scrapy动态页面爬取的另一种思路
		前面有篇文章给出了爬取动态页面的一种思路,即应用Selenium+Firefox(参考<scrapy动态页面爬取>).但是selenium需要运行本地浏览器,比较耗时,不太适合大规模网页抓 ... 
- 安居客scrapy房产信息爬取到数据可视化(下)-可视化代码
		接上篇:安居客scrapy房产信息爬取到数据可视化(下)-可视化代码,可视化的实现~ 先看看保存的数据吧~ 本人之前都是习惯把爬到的数据保存到本地json文件, 这次保存到数据库后发现使用mongod ... 
- [Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)
		转载自:http://blog.csdn.net/eastmount/article/details/51231852 一. 文章介绍 源码下载地址:http://download.csdn.net/ ... 
- 用WebCollector爬取新浪微博数据
		教程已转移:http://datahref.com/archives/28 WebCollector爬取新浪微博等完整演示样例project可加群250108697或345054141从群文件里下载. ... 
- Scrapy定时执行爬取任务与定时关闭任务
		当我们利用Python scrapy框架写完脚本后,脚本已经可以稳定的进行数据的爬取,但是每次需要手动的执行,太麻烦,如果能自动运行,在自动关闭那就好了,经过小编研究,完全是可以实现的,今天小编介绍2 ... 
- Scrapy爬虫笔记 - 爬取知乎
		cookie是一种本地存储机制,cookie是存储在本地的 session其实就是将用户信息用户名.密码等)加密成一串字符串,返回给浏览器,以后浏览器每次请求都带着这个sessionId 状态码一般是 ... 
- scrapy框架 + selenium 爬取豆瓣电影top250......
		废话不说,直接上代码..... 目录结构 items.py import scrapy class DoubanCrawlerItem(scrapy.Item): # 电影名称 movieName = ... 
- Scrapy实战篇(八)之Scrapy对接selenium爬取京东商城商品数据
		本篇目标:我们以爬取京东商城商品数据为例,展示Scrapy框架对接selenium爬取京东商城商品数据. 背景: 京东商城页面为js动态加载页面,直接使用request请求,无法得到我们想要的商品数据 ... 
- 【scrapy】关于爬取的内容是Unicode编码
		自己练习爬取拉钩网信息的时候爬取的信息如下: {'jobClass': [u'\u9500\u552e\u52a9\u7406'], 'jobUrl': u'https://www.lagou.com ... 
随机推荐
- h5图片上传简易版(FileReader+FormData+ajax)
			一.选择图片(input的file类型) <input type="file" id="inputImg"> 1. input的file类型会渲染为 ... 
- 学习新框架laravel4 第一天(- -! 新公司版本使用的4,所以还要重新学习)
			路由使用: //根目录 Route::get('/', function() { return View::make('hello'); }); 自定义模板: /app/views/home/inde ... 
- Learning notes | Data Analysis: 1.2 data wrangling
			| Data Wrangling | # Sort all the data into one file files = ['BeijingPM20100101_20151231.csv','Chen ... 
- go内建容器-切片
			1.基础定义 看到'切片'二字,满脸懵逼.切的啥?用的什么刀法切?得到的切片有什么特点?可以对切片进行什么操作? 先看怎么得到切片,也就是前两个问题.切片的底层是数组,所以切片切的是数组:切的时候采用 ... 
- golang 协程嵌套,会产生依赖关系(父子关系)么?
			编码时冒出一个问题:在一个协程内部,再创建一个或多个协程,是否会产生依赖关系? 做了一个小实验,这里随笔记录一下经过,备注后续深入研究. test代码: package main import ( & ... 
- mySQL安装的时候一直卡在starting server这里解决办法
			昨天安装mySQL的时候一直卡在了starting server这里,等了半天都没反应,后来就去网上寻找解决办法,大部分是说什么设置mysql本地启动服务啊,删除注册表啊,这些办法都试过了 然并卵. ... 
- 初识Trie_对Trie的一些认识
			Trie,之前觉得一个听起来很diao的数据结构,学了发现其实是一个挺简单的数据结构. 在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串.与二叉查找树 ... 
- Java:xxx is not an enclosing class
			1. 错误原因 该错误一般出现在对内部类进行实例化时,例如 public class A{ public class B{ } } 此时B是A的内部类,如果我们要使用如下语句实例化一个B类的对象: A ... 
- LWM2M简介-学习记录
			1. Lightweight M2M 基础,谁搞出来的 OMA是一家国际组织,因为物联网的兴起, OMA在传统的OMA-DM协议基础之上,提出了LWM2M协议.这个协议基于COAP协议,COAP协议基 ... 
- 使用vs code写php及调试
			原文来自:http://www.cnblogs.com/CLR010/p/5276077.html 首页先改下php.ini 一般是在最底部,有就修改没有就加上去下面的配置: xdebug.remot ... 
