利用scrapy和MongoDB来开发一个爬虫

今天我们利用scrapy框架来抓取Stack Overflow里面最新的问题(),并且将这些问题保存到MongoDb当中,直接提供给客户进行查询。

安装

在进行今天的任务之前我们需要安装二个框架,分别是Scrapy (1.1.0)和pymongo (3.2.2).

scrapy

如果你运行的的系统是osx或者linux,可以直接通过pip进行安装,而windows需要另外安装一些依赖,因为电脑的原因不对此进行讲解。

$ pip install Scrapy

一旦安装完成之后你可以直接在python shell当中输入下面的命令,倘若没有出现错误的话,说明已安装完成

>>> import scrapy
>>>

安装PyMongo和mongodb

因为系统是osx的,所以直接通过下面的语句就可以安装。

brew install mongodb

运行mongodb同样特别的简单,只需要在终端下面输入下面的语法:

mongod --dbpath=.

--dbpath是指定数据库存放的路径,运行之后会在该路径下面生成一些文件

下一步我们就需要安装PyMongo,同样采用pip的方式

$ pip install pymongo

Scrapy 项目

我们来创建一个新的scrapy的项目,在终端输入下面的语法

$ scrapy startproject stack


一旦上面的命令完成之后,scrapy会直接创建相应的文件,这些文件包含了基本的信息,便于你来修改相应的内容。

定义数据

items.py文件用于我们定义需要抓取对象的存储的“容器“
有关StackItem()预定义时并让其继承于scrapy.Item

# -*- coding: utf-8 -*-# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.htmlimport scrapyclass StackItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()pass

这里我们需要在里面添加两个字段,分别用来存放抓取到的标题以及链接


from scrapy.item import Item,Fieldclass StackItem(Item):# define the fields for your item here like:title=Field()url=Field()

创建爬虫

我们需要在spider文件夹下面创建一个stack_spider.py的文件,这个里面包容我们爬虫进行抓取时的行为。就是告诉爬虫我们需要抓取哪些内容以及内容的来源。

from scrapy import Spider
from scrapy.selector import Selector
from stack.items import StackItemclass StackSpider(Spider):name="stack"allowed_domains=['stackoverflow.com']start_urls = ["http://stackoverflow.com/questions?pagesize=50&sort=newest",]
  • name 是定义爬虫的名称
  • allowed_domains 指定爬虫进行爬取的域地址
  • start_urls 定义爬虫需要抓取的网页的url地址

XPath 选择

scrapy使用XPath来进行匹配相应的数据的来源,html是一种标记的语法,里面定义了很多的标签和属性,比如说我们定义一个下面的这样的一个标签,这里我们就可以通过'//div[@class="content"]'来找到这个标记,找到之后我们可以取出其中的属性或者它的子节点

<div class='content'>

下面我们通过chrome来讲解如果找到xpath的路径 ,在进行操作之前我们需要打开开发者工具,可以点击菜单栏上面的视图->开发者->开发者工具来打进入开发者模式,或者可以根据快捷捷来进行打开。

打开之后我们在需要的内容上面点击右击会弹出一个菜单,这里我们可以选择检查来找到当前的内容在html相应的位置

这里chrome会自动帮助我们找到相应的位置,通过下面的分析,我们知道标题的路径是包含在一个

下面的h3标记当中。

现在我们来更新相应的stack_spider.py脚本

from scrapy import Spider
from scrapy.selector import Selector
from stack.items import StackItemclass StackSpider(Spider):name="stack"allowed_domains=['stackoverflow.com']start_urls = ["http://stackoverflow.com/questions?pagesize=50&sort=newest",]def parse(self,response):questions=Selector(response).xpath('//div[@class="summary"]/h3')

提取数据

创建抓取的规约之后,我们需要与刚才创建的items实体进行关联,我们继续修改stack_spider.py文件

from scrapy import Spider
from scrapy.selector import Selector
from stack.items import StackItemclass StackSpider(Spider):name="stack"allowed_domains=['stackoverflow.com']start_urls = ["http://stackoverflow.com/questions?pagesize=50&sort=newest",]def parse(self,response):questions=Selector(response).xpath('//div[@class="summary"]/h3')for question in questions:item=StackItem()item['title'] = question.xpath('a[@class="question-hyperlink"]/text()').extract()[0]item['url'] = question.xpath('a[@class="question-hyperlink"]/@href').extract()[0]yield item

通过遍历所有的符合//div[@class="summary"]/h3的元素,并且从中找到我们真正需要爬取的元素内容

测试

现在我们进行测试,只要在项目的目录下面运行以下的脚本就可以进行测试 。

scrapy crawl stack

现在我们需要将爬取到的所有的信息保存到一个文件当中,可以在后面添加二个参数-o和-t

scrapy crawl stack -o items.json -t json

下面是实际保存的文件的内容分别包含了title和url

将元素存放入MongoDB

这里我们需要将所有的元素保存到Mongodb collection当中。
在进行操作之前我们需要在setinngs.py指定相应的pipeline和添加一些数据库的参数

ITEM_PIPELINES = {'stack.pipelines.MongoDBPipeline': 300,
}
MONGODB_SERVER = "localhost"
MONGODB_PORT = 27017
MONGODB_DB = "stackoverflow"
MONGODB_COLLECTION = "questions"

pipeline 管理

在之前的步骤里面我们分别已经完成了对html的解析,以及指定数据的存储。但是这时所有的信息都在内存当中,我们需要将这些爬取到数据存储到数据库当中,这里就轮到pipelines.py上场了,这玩意就负责对数据的存储的。
在上面我们已经定义了数据库的参数,现在我们终于派上用场了。

import pymongo
from scrapy.conf import settings
from scrapy.exceptions import DropItem
from scrapy import logclass MongoDBPipeline(object):def __init__(self):connection=pymongo.MongoClient(settings['MONGODB_SERVER'],settings['MONGODB_PORT'])db=connection[settings['MONGODB_DB']]self.collection=db[settings['MONGODB_COLLECTION']]

上面的代码是我们创建了一个MongoDBPipeline()的类,以及定义初始化函数,用来读取刚才的参数来创建一个Mongo的连接。

数据处理

下一步我们需要定义一个函数来处理解析的数据

# -*- coding: utf-8 -*-# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
import pymongo
from scrapy.conf import settings
from scrapy.exceptions import DropItem
from scrapy import logclass MongoDBPipeline(object):def __init__(self):connection=pymongo.MongoClient(settings['MONGODB_SERVER'],settings['MONGODB_PORT'])db=connection[settings['MONGODB_DB']]self.collection=db[settings['MONGODB_COLLECTION']]def process_item(self,item,spider):valid=Truefor data in item:if not data:valid=Falseraise DropItem('Missing{0}!'.format(data))if valid:self.collection.insert(dict(item))log.msg('question added to mongodb database!',level=log.DEBUG,spider=spider)return item

上面已经完成了对数据的连接,以及相应数据的存储

测试

我们同样在stack目录当中运行下面的命令

$ scrapy crawl stack

当内容执行完成之后没有出现任何的错误的提示,恭喜你已经将数据正确的存入到mongodb当中。
这里我们通过Robomongo来访问数据库的时候发现创建了一个stackoverflow的数据库,下面已经成功创建了一个名为questions的Collections.并且已经存入了相应的数据了。

posted on 2016-12-26 18:19 Kilichko 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/Yemilice/p/6223304.html

利用scrapy和MongoDB来开发一个爬虫相关推荐

  1. [绍棠] Scrapy+Flask+Mongodb+Swift开发全攻略

    Scrapy+Flask+Mongodb+Swift开发全攻略 先一一介绍一下上面4个东西.第一个叫做Scrapy的东西是用python写的爬虫框架. Flask是python写的一个非常有名的web ...

  2. 利用WCF的callback机制开发一个简单的多人游戏模型

    本文介绍了如何利用WCF和callback机制开发一个简单的多人在线游戏模型. 运行过程如下: 当game service 启动之后,若干个客户端便会自动连接到服务器.当某个客户端点击join gam ...

  3. python scrapy 入门,10分钟完成一个爬虫

    在TensorFlow热起来之前,很多人学习python的原因是因为想写爬虫.的确,有着丰富第三方库的python很适合干这种工作. Scrapy是一个易学易用的爬虫框架,尽管因为互联网多变的复杂性仍 ...

  4. 10分钟python爬虫_python scrapy 入门,10分钟完成一个爬虫

    在TensorFlow热起来之前,很多人学习python的原因是因为想写爬虫.的确,有着丰富第三方库的python很适合干这种工作. Scrapy是一个易学易用的爬虫框架,尽管因为互联网多变的复杂性仍 ...

  5. python笔记之利用scrapy框架爬取糗事百科首页段子

    环境准备: scrapy框架(可以安装anaconda一个python的发行版本,有很多库) cmd命令窗口 教程: 创建爬虫项目 scrapy startproject qq #创建了一个爬虫项目q ...

  6. Python利用Scrapy爬取前程无忧

    ** Python利用Scrapy爬取前程无忧 ** 一.爬虫准备 Python:3.x Scrapy PyCharm 二.爬取目标 爬取前程无忧的职位信息,此案例以Python为关键词爬取相应的职位 ...

  7. 如何使用php写爬虫,PHP如何开发简单爬虫

    有时候因为工作.自身的需求,我们都会去浏览不同网站去获取我们需要的数据,于是爬虫应运而生,下面是开发一个简单爬虫的经过与遇到的问题.开发一个爬虫,首先你要知道你的这个爬虫是要用来做什么的.我是要用来去 ...

  8. python的Tkinter库简单应用——开发一个简易计算器

    利用python的Tkinter库开发一个简易计算器 文章目录 利用python的Tkinter库开发一个简易计算器 前言 一.实验准备 二.开发步骤步骤 1.引入库 2.界面设计 3.关键--实现T ...

  9. 实战 | 如何利用 Scrapy 编写一个完整的爬虫!

    大家好,我是安果! 提到爬虫框架,这里不得不提 Scrapy,它是一款非常强大的分布式异步爬虫框架,更加适用于企业级的爬虫! 项目地址: https://github.com/scrapy/scrap ...

最新文章

  1. PTA数据结构与算法题目集(中文)7-38
  2. redis 永不过期 java_死磕 Java
  3. mysql server安装不成功,解决Mysql5.7.17在windows下安装启动时提示不成功问题
  4. 中国版“微软”要来了?某国产操作系统称已可以替代Windows 7
  5. [Golang] 第三方包应该如何安装--在线和离线
  6. 推荐几款热门的敏捷开发工具
  7. 无法安装64位版本的office,因为在您的PC上找到了以下32位程序:microsoft visio professional 2013
  8. SaaS的行业概述及发展现状
  9. linux内核锁死怎么解决_解决Linux内核中的2038年问题
  10. 【转】glTexImage2D()和gluBuild2DMipmaps() [将载入的位图文件(*.bmp)转换成纹理贴图]+glTexParameteri()纹理过滤函数...
  11. Vert.x(vertx)发送 HTTP/HTTPS请求
  12. 一个小故事读懂Memcached漏洞
  13. 资源管理器和计算机的功能基本相同吗,“资源管理器”和“计算机”的功能基本相同...
  14. UTM投影坐标计算距离
  15. DBC文件解析及CAN通信矩阵
  16. Adreno GPU Profiler工具使用总结
  17. Excel小技巧-获取列数
  18. 识别到硬盘 计算机不显示盘符,移动硬盘不显示盘符怎么办
  19. 简单实验uwsgi+flask 部署caffe模型
  20. 在线网页群发短信平台哪家好

热门文章

  1. HDOJ 1070 排序 水
  2. margin折叠问题
  3. 机器学习、数据挖掘及其他
  4. 什么叫系统的可扩展性?
  5. Openresty使用
  6. python中collection.Counter and和的区别
  7. 上传图片到第三方服务器
  8. 【Python3_进阶系列_006】Python3-单例模式
  9. Qt ffmpeg环境搭建
  10. 【转】HTML5 本地存储五种方案