Scrapy存入MySQL(五):实战Scrapy中文网存入MySQL

时间:2018-01-31 10:07:38作者:scrapy中文网阅读:

通过前面的scrapy教程,我们已经把scrapy存入Mysql的每一个细节都讲得一清二楚,包括:MySQL的安装(文:《Mysql快速无坑安装》)、MySQL的管理(文:《Navicat使用详解》)、MySQL驱动安装问题(文:《Python Mysql驱动安装及填坑教程》)、Scrapy数据存入MySQL实现原理(文:《MySQLPipeline插件实现细节》),如果对细节还有疑惑,不妨移步上面内容See See!这一讲我们玩点实战,把上面零星的内容给串起来,好了,先来看一下我们的环境:

 win7 64位   Python3.6   Scrapy1.4  


环境看了,接下来看一下我们要实现的需求,我们还是爬取Scrapy中文网实验室的内容,也就是这么个网址里面的东东:http://lab.scrapyd.cn,这里的话请诸君可能要问了,怎么又是这个网址,之所以这样,是因为这个网址是我们专门维护的,那就能避免因沧海桑田打不开网址、让你的爬虫实验无法完成的问题,最终也能让你快速掌握scrapy数据存入MySQL的原理。好了,来看我们的需求:
scrapy存入mysql
好了就这么个需求,也就是把整个lab.scrapyd.cn的内容都拿下,这里的话其实也就是scrapy爬取下一页的内容,若不清楚,请参看文档:《scrapy下一页(多页)爬取》,很简单,接下来我们一步、一步来!

一、创建蜘蛛项目
scrapy startproject scrapyMysql
二、编写要存入数据库的字段item

进入scrapyMysql/scrapyMysql目录下,打开:items.py,编写相应的items,item其实就是对应着我们的字段,这里我们只存两个字段:名言、标签,因此这里我们就添加两个item,代码如下
import scrapy

class ScrapymysqlItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    tag = scrapy.Field()  # 标签字段
    cont = scrapy.Field()  # 名言内容
    pass

三、编写蜘蛛文件

进入scrapyMysql/scrapyMysql/spiders目录,创建蜘蛛文件,命名为:inputMysql.py然后在此文件中编写相应规则,若对蜘蛛具体细节不清楚,请查看《scrapy下一页(多页)爬取》,具体代码如下:
# -*- coding: utf-8 -*-
import scrapy
from scrapyMysql.items import ScrapymysqlItem  # 引入item


class InputmysqlSpider(scrapy.Spider):
    name = "inputMysql"
    allowed_domains = ["lab.scrapyd.cn"]
    start_urls = ['http://lab.scrapyd.cn/']

    def parse(self, response):
        mingyan = response.css('div.quote')

        item = ScrapymysqlItem()  # 实例化item类

        for v in mingyan:  # 循环获取每一条名言里面的:名言内容、作者、标签
            item['cont'] = v.css('.text::text').extract_first()  # 提取名言
            tags = v.css('.tags .tag::text').extract()  # 提取标签
            item['tag'] = ','.join(tags)  # 数组转换为字符串
            yield item  # 把取到的数据提交给pipline处理

        next_page = response.css('li.next a::attr(href)').extract_first()  # css选择器提取下一页链接
        if next_page is not None:  # 判断是否存在下一页
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, callback=self.parse)  # 提交给parse继续抓取下一页


四、编写MySQL存储插件:MySQLPipeline.py
import pymysql.cursors
class MySQLPipeline(object):
    def __init__(self):
        # 连接数据库
        self.connect = pymysql.connect(
            host='127.0.0.1',  # 数据库地址
            port=3306,  # 数据库端口
            db='scrapyMysql',  # 数据库名
            user='root',  # 数据库用户名
            passwd='root',  # 数据库密码
            charset='utf8',  # 编码方式
            use_unicode=True)
        # 通过cursor执行增删查改
        self.cursor = self.connect.cursor()

    def process_item(self, item, spider):
        self.cursor.execute(
            """insert into mingyan(tag, cont)
            value (%s, %s)""",  # 纯属python操作mysql知识,不熟悉请恶补
            (item['tag'],  # item里面定义的字段和表字段对应
             item['cont'],))
        # 提交sql语句
        self.connect.commit()
        return item  # 必须实现返回


五、settings启动MySQLPipline组件

ITEM_PIPELINES = {
   'scrapyMysql.MySQLPipline.MySQLPipeline': 300,
}


六、创建相应数据库

启动MySQL数据库服务,创建数据库:scrapyMysql,如下图:
scrapy存入mysql
 
scrapyMysql中创建表:mingyan,并添加三个字段:id(名言id自增)、tag(名言标签)、cont(名言内容),如下图:
创建mingyan表
添加完成后,那接下来就是见证奇迹的时候了,运行爬虫:
scrapy crawl inputMysql
我们打开数据库,可以看到,全站数据都已经爬回来并存储在mysql里了,如下图:
scrapy爬取数据存入mysql
七、项目地址


Scrapy存入MySQL项目实战:GITHUB


scrapy教程虽然是一个简简单单的存入mysql的练习,但其实综合了许多东东,特别是MySQL的安装、使用、以及scrapy组件编写的一些规则……从这么一个练习至少给我们这么一个启示:技多不压身,因此:学不可以已!

相关文章