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 |
你可以看到爬虫已经把明凯博客第一页打印出来了。
如果想继续跟踪每篇文章链接进去,看看它的详细内容的话,那么可以在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 |
看看我们的数据库
那么我们将采集到的内容全部保存到数据库了。
windows Git Bash 无法运行python解决方法 Sublime Text3安装SublimeREPL方便运行Python的的方法