使用Scrapy结合MongoDB爬取最美应用数据

又开新坑了,最近迷上了爬虫,塞尔达,数据结构。。。时间不够用了已经。

近几天简单的学习了Scrapy这个框架,简单好用;

第一步 准备工作

1、安装(基于python3.x环境)

pip3 install scrapy

2、安装pycharm
建议购买正版。。。

3、下载MongoDB和它的GUI工具 下载链接;

4、安装pymongo

pip3 install pymongo

安装完毕之后 终端输入 mongod 启动数据库服务;

2017-04-28T10:32:43.344+0800 I FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory '/data/db/diagnostic.data'
2017-04-28T10:32:43.345+0800 I NETWORK  [thread1] waiting for connections on port 27017

开始

简单介绍下Scrapy
简单使用主要需要了解三个文件;
1、items.py
主要用来接收和暂时保存爬取到的数据
2、spider
主要负责爬取数据
3、pipelines.py
如果需要存入数据库,在这个文件中操作

爬取数据

目标:爬取最美应用网页端的APP数据

1、打开终端

scrapy startproject zhuimei

2、使用 pyCharm打开工程

《使用Scrapy结合MongoDB爬取最美应用数据》 项目结构

其中main.py 需要自己创建,为后面调试做准备

3、接下来需要将zhuimei文件夹设置为Sources Root 以便pycharm查找module;
右击文件夹按下面图操作

《使用Scrapy结合MongoDB爬取最美应用数据》 操作过程

4、打开items.py,文件中已经存在一个和项目同名的Item,可以使用也可以重新声明一个类;
在文件中声明一个类 zuimeiItem;

class zuimeiItem(scrapy.Item):
    id = Field()    # 每个APP的id编号
    title = Field()  #APP 大标题
    subtitle = Field() #副标题
    url = Field()   #下载链接
    date = Field() #时间

5、在Spiders文件夹下新建文件zuimeispider.py
导入

from scrapy import Spider,Request
from scrapy import Selector
from zhuimei.items import zuimeiItem

声明一个类继承于Spider

class ZuiMeiSpider(Spider):
    name = "zuimei"   #启动爬虫时以这个名为准
    allowd_domains = ["http://www.zuimeia.com"]
    start_urls = ['http://www.zuimeia.com']

接下来解析我们爬取到的数据
利用火狐浏览器的 firebug 和 firepath插件来审查页面

《使用Scrapy结合MongoDB爬取最美应用数据》 结构

通过审查我们可以看到 app的title是存储在 一个类名为“app-title”的标签下面的h1标签下,所以我们使用Xpath获取文字

sel = Selector(response)
        title_list = sel.xpath(".//*[@class='app-title']/h1/text()").extract()

同理获取到副标题,时间和下载链接

        subtitle_list = sel.xpath(".//*[@class='sub-title']/text()").extract()
        date_list = sel.xpath(".//*[@class='pub-time']/text()").extract()
        url_list = sel.xpath(".//*[@class='detail-icon']/@href").extract()

最后将获取到的数据用item接收保存

        for title,subtitle,date,url in zip(title_list,subtitle_list,date_list,url_list):
            item = zuimeiItem()
            item["id"] = url[5:9]
            item["title"] = title
            item["subtitle"] = subtitle
            item["date"] = date
            item["url"] = self.allowd_domains[0] + url #下载需要拼接成完整的url
            yield item

可以在上述代码中添加 print,输出爬取到的数据
到这步结束,我们就可以启动爬虫,爬取数据了可以选择两个方法

1、直接打开终端,进入到项目目录下

scrapy crawl zuimei

2、在新建的main.py中

from  scrapy import cmdline

cmdline.execute("scrapy crawl zuimei".split())

打开 Run下的Edit Configurations

《使用Scrapy结合MongoDB爬取最美应用数据》 打开

新建一个 python,并把main.py的路径添加到Script;

《使用Scrapy结合MongoDB爬取最美应用数据》 新建一个debug配置

现在可以直接使用pycharm的debug功能了;
两种方法其实原理上相同;

将数据存入数据库

1、打开settings.py文件

#取消注释
ITEM_PIPELINES = {
   'zhuimei.pipelines.ZhuimeiPipeline': 300,
}

#添加下面代码
MONGODB_HOST = '127.0.0.1'
MONGODB_PORT = 27017
#本地数据库的名字可以自己起,这边直接使用 MongoDB自带
MONGODB_DBNAME = 'local'

2、打开pipelines.py ,添加下面代码

class ZhuimeiPipeline(object):
    def __init__(self):
        host = settings['MONGODB_HOST']
        port = settings['MONGODB_PORT']
        dbName = settings['MONGODB_DBNAME']
        client = pymongo.MongoClient(host=host, port=port)
        db = client[dbName]
        self.post = db["zuimei"] # 连接表,表需要在MongoDB compass 中创建

    def process_item(self, item, spider):
        appInfo = dict(item)
        #防止数据重复存入
        self.post.update({'id':item['id']},{'$set':dict(item)},True)
        return item

3、确认数据库服务已经启动
打开MongoDB Compass, connect;

《使用Scrapy结合MongoDB爬取最美应用数据》 打开Compass

  在 local数据库中新建表 zuimei,注意这里一定要和pipelines中表名一致

《使用Scrapy结合MongoDB爬取最美应用数据》 新建表

4、启动爬虫,待程序运行结束后

《使用Scrapy结合MongoDB爬取最美应用数据》 数据

结语

这只是个简单的爬虫,只能爬取当前页面的数据,后面我会补全翻页抓取的操作。

    原文作者:NSLogHome
    原文地址: https://www.jianshu.com/p/8071c7060788
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞