Python蜘蛛scrapy的采集数据到数据库的详细方法
编写爬虫其实很简单,现在我们以最短的时间写一个最简单的爬虫,来爬写明凯博客首页的内容。
爬虫编写的基本流程:
创建一个新的Scrapy工程
定义你所需要要抽取的Item对象
编写一个spider来爬取某个网站并提取出所有的Item对象
编写一个Item Pipline来存储提取出来的Item对象
1、创建Scrapy工程
随便建一个工作目录,然后用命令行建立一个工程,工程名为mkscrapy。
scrapy startproject mkscrapy
将会创建mkscrapy文件夹,其目录结构如下
mkscrapy/
scrapy.cfg # 部署配置文件
mkscrapy/ # Python模块,你所有的代码都放这里面
__init__.py
items.py # Item定义文件
pipelines.py # pipelines定义文件
settings.py # 配置文件
spiders/ # 所有爬虫spider都放这个文件夹下面
__init__.py
...
2、定义我们的Item
我们通过创建一个scrapy.Item类,并定义它的类型为scrapy.Field的属性。
class AimksItem(scrapy.Item):
title = scrapy.Field() #标题
link = scrapy.Field() #链接
content = scrapy.Field() #正文
我们这里定义了标题,链接,正文,定义完之后你可以得到许多好处,这样你就可以使用Scrapy中其他有用的组件和帮助类。
3、编写一个spider
蜘蛛就是你定义的一些类,Scrapy使用它们来从一个domain(或domain组)爬取信息。
在蜘蛛类中定义了一个初始化的URL下载列表,以及怎样跟踪链接,如何解析页面内容来提取Item。
我们在mkscrapy/spiders文件夹下面新建aimks_spider.py,内容如下:
#-*- coding:utf-8 -*-
import scrapy
from mkscrapy.items import AimksItem
class AimksSpider(scrapy.Spider):
name = "aimks"
allowed_domains = ["aimks.com"]
start_urls = [
"https://www.limingkai.com/"
]
def parse(self, response):
for sel in response.css('.post'):
item = AimksItem()
item['title']=sel.xpath('./h2/a/text()').extract()[0].encode('utf-8')
item['link']=sel.xpath('./h2/a/@href').extract()[0].encode('utf-8')
print item['title']
在根目录执行下面的命令
scrapy crawl aimks
你可以看到爬虫已经把明凯博客第一页打印出来了。

如果想继续跟踪每篇文章链接进去,看看它的详细内容的话,那么可以在parse()方法中返回一个Request对象, 然后注册一个回调函数来解析文章详情。
#-*- coding:utf-8 -*-
import scrapy
from mkscrapy.items import AimksItem
class AimksSpider(scrapy.Spider):
name = "aimks"
allowed_domains = ["aimks.com"]
start_urls = [
"https://www.limingkai.com/"
]
def parse(self, response):
for sel in response.css('.post'):
item = AimksItem()
item['title']=sel.xpath('./h2/a/text()').extract()[0].encode('utf-8')
item['link']=sel.xpath('./h2/a/@href').extract()[0].encode('utf-8')
print item['title']
url=item['link']
yield scrapy.Request(url,meta={'item': item},callback=self.parse_article)
def parse_article(self,response):
item = response.meta['item']
item['content'] = response.css('.main').extract()[0].encode('utf-8')
print item['content']
yield item
保存抓取数据的最简单方式是使用json格式的文件保存在本地:
scrapy crawl aimks -o items.json
然后再项目文件夹里面可以看到多出了items.json这个文件。
4、保存数据到mysql
首先我们在mkscrapy/pipelines.py定义:
# -*- 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 os
import sys
import codecs
import json
import MySQLdb
import MySQLdb.cursors
from scrapy.conf import settings
class MkscrapyPipeline(object):
def process_item(self, item, spider):
return item
class MysqlPipeline(object):
'''保存到mysql'''
def process_item(self,item,spider):
# 将item里的数据拿出来
title = item['title']
link = item['link']
content = item['content']
# 和本地的数据库建立连接
host = settings['MYSQL_HOSTS']
user = settings['MYSQL_USER']
psd = settings['MYSQL_PASSWORD']
db = settings['MYSQL_DB']
cha=settings['CHARSET']
db = MySQLdb.connect(host=host,user=user,passwd=psd,db=db,charset=cha)
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
sql = "INSERT INTO aimks(title,link,content) VALUES (%s,%s,%s)"
data=[title,link,content]
try:
# 执行SQL语句
cursor.execute(sql,data)
# 提交修改
db.commit()
print title+':导入成功'
except:
db.rollback()
print title+':导入失败'
finally:
# 关闭连接
db.close()
return item
然后在setting.py中配置这个Pipeline,还有数据库链接等信息:
MYSQL_HOSTS = '127.0.0.1'
MYSQL_USER = 'root'
MYSQL_PASSWORD = ''
MYSQL_DB='spider'
CHARSET='utf8'
ITEM_PIPELINES={
'mkscrapy.pipelines.MysqlPipeline': 100,
}
再次运行爬虫
scrapy crawl aimks
看看我们的数据库

那么我们将采集到的内容全部保存到数据库了。
windows Git Bash 无法运行python解决方法 Sublime Text3安装SublimeREPL方便运行Python的的方法