实战Scrapy中文网存入MySQL
本机环境: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