明凯博客

关注网站技术,一个特立独行的程序员

Python蜘蛛scrapy的采集数据到数据库的详细方法

编写爬虫其实很简单,现在我们以最短的时间写一个最简单的爬虫,来爬写明凯博客首页的内容。

爬虫编写的基本流程:

创建一个新的Scrapy工程
定义你所需要要抽取的Item对象
编写一个spider来爬取某个网站并提取出所有的Item对象
编写一个Item Pipline来存储提取出来的Item对象

1、创建Scrapy工程

随便建一个工作目录,然后用命令行建立一个工程,工程名为mkscrapy。

1
scrapy startproject mkscrapy

将会创建mkscrapy文件夹,其目录结构如下

1
2
3
4
5
6
7
8
9
10
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的属性。

1
2
3
4
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,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#-*- 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']

在根目录执行下面的命令

1
scrapy crawl aimks

你可以看到爬虫已经把明凯博客第一页打印出来了。
20170927165742

如果想继续跟踪每篇文章链接进去,看看它的详细内容的话,那么可以在parse()方法中返回一个Request对象, 然后注册一个回调函数来解析文章详情。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#-*- 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格式的文件保存在本地:

1
scrapy crawl aimks -o items.json

然后再项目文件夹里面可以看到多出了items.json这个文件。

4、保存数据到mysql

首先我们在mkscrapy/pipelines.py定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# -*- 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,还有数据库链接等信息:

1
2
3
4
5
6
7
8
9
MYSQL_HOSTS = '127.0.0.1'
MYSQL_USER = 'root'
MYSQL_PASSWORD = ''
MYSQL_DB='spider'
CHARSET='utf8'
 
ITEM_PIPELINES={
    'mkscrapy.pipelines.MysqlPipeline': 100,
}

再次运行爬虫

1
scrapy crawl aimks

看看我们的数据库
20170927170439

那么我们将采集到的内容全部保存到数据库了。

, ,

相关文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注