实战Scrapy中文网存入MySQL

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30500113/article/details/83340037
	 本机环境:win7 64位   Python3.6   Scrapy1.5

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

一、创建蜘蛛项目
1:scrapy startproject scrapyMysql

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

# -*- coding: utf-8 -*-
import scrapy


class ScrapyMysqlItem(scrapy.Item):
    # 标签
    tag = scrapy.Field()
    # 内容
    content = scrapy.Field()

三、编写蜘蛛文件

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

# -*- coding: utf-8 -*-
import scrapy
from scrapyMysql.items import ScrapyMysqlItem


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类
        item = ScrapyMysqlItem()
        # 循环获取每一条名言里面的:名言内容、作者、标签
        for v in mingyan:
            # 提取名言
            item['content'] = v.css('.text::text').extract_first()
            # 提取标签
            tags = v.css('.tags .tag::text').extract()
            # 数组转换为字符串
            item['tag'] = ','.join(tags)
            # 把取到的数据提交给pipline处理
            yield item
        # css选择器提取下一页链接
        next_page = response.css('li.next a::attr(href)').extract_first()
        # 判断是否存在下一页
        if next_page is not None:
            next_page = response.urljoin(next_page)
            # 提交给parse继续抓取下一页
            yield scrapy.Request(next_page, callback=self.parse)

四、编写MySQL存储插件:pipelines.py

# -*- coding: utf-8 -*-
import pymysql


class ScrapymysqlPipeline(object):
    def __init__(self):
        self.connect = pymysql.connect(
            host='127.0.0.1',
            port=3306,
            db='novel',
            user='root',
            password='123456',
            charset='utf8',
            use_unicode=True
        )
        # 通过cursor执行增删查改
        self.cursor = self.connect.cursor()

    def process_item(self, item, spider):
        self.cursor.execute(
            # 纯属python操作mysql知识,不熟悉请恶补
            """insert into mingyan(tag, content) value (%s, %s)""", (item['tag'], item['content'],))
        # 提交事务
        self.connect.commit()
        # 必须实现返回
        return item

五、settings启动MySQLPipline组件
打开settings.py 把这里的注释去掉
ITEM_PIPELINES = {
‘scrapyMysql.pipelines.ScrapymysqlPipeline’: 300,
}

六、创建相应数据库和表

启动MySQL数据库服务,创建数据库和表,如下图:
创建表:mingyan,并添加三个字段:id(名言id自增)、tag(名言标签)、content(名言内容),如下图:
在这里插入图片描述

添加完成后,那接下来就是见证奇迹的时候了,运行爬虫:

scrapy crawl inputMysql

我们打开数据库,可以看到,全站数据都已经爬回来并存储在mysql里了,如下图:
在这里插入图片描述

由于没有设置主键默认值 报错了
pymysql.err.InternalError: (1364, “Field ‘id’ doesn’t have a default value”)

我通过navcat给主键设置了自动增长
然后运行就可以了

文章并非原创,内容来源于http://www.scrapyd.cn/jiaocheng/170.html

猜你喜欢

转载自blog.csdn.net/qq_30500113/article/details/83340037