Scrapy抓取数据存入数据库(示例一)


一、示例一:Scrapy抓取豆瓣编程分类第一页的图书名称和链接并存入数据库


1. 要抓取的文件在items.py中定义,我们要抓取的是图书的名称和链接

2. spiders下的文件
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from second.items import bbs
 
class bbsSpider(BaseSpider):
      name = "boat"
      allow_domains = ["http://book.douban.com/tag/编程?type=S"]
      start_urls = ["http://book.douban.com/tag/编程?type=S"]
      def parse(self, response):
hxs = HtmlXPathSelector(response)
items = []
item = bbs()
item['title'] = hxs.select('//ul/li[position()>0]/div[2]/h2/a/@title').extract()
item['link'] = hxs.select('//ul/li[position()>0]/div[2]/h2/a/@href').extract() 
items.append(item)
return items


3. pipelines文件,关于scrapy保存到数据库请看twisted的资料

# -*- 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/topics/item-pipeline.html

from scrapy import log
from twisted.enterprise import adbapi
from scrapy.http import Request  
from scrapy.exceptions import DropItem  
from scrapy.contrib.pipeline.images import ImagesPipeline  
import time  
import MySQLdb  
import MySQLdb.cursors
import socket
import select
import sys
import os
import errno
#连接数据库
class MySQLStorePipeline(object):
      def __init__(self):
self.dbpool = adbapi.ConnectionPool('MySQLdb',  
                        db = 'test',  
                        user = 'root',  
                        passwd = 'root',  
                        cursorclass = MySQLdb.cursors.DictCursor,  
                        charset = 'utf8',  
                        use_unicode = False  
            )  
      #pipeline默认调用
      def process_item(self, item, spider):
query = self.dbpool.runInteraction(self._conditional_insert, item)  
return item
      #将每行写入数据库中
      def _conditional_insert(self, tx, item):  
if item.get('title'):
for i in range(len(item['title'])):
tx.execute('insert into book values (%s, %s)', (item['title'][i], item['link'][i])) 

4. 在setting.py中添加pipeline:
  ITEM_PIPELINES = ['second.pipelines.MySQLStorePipeline']

5. 需要提前在数据库中建立test数据库和book表。

      新建数据库:create database 库名,为了让mysql正常显示中文,在建立数据库的时候使用如下语句:
      CREATE DATABASE test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

      新建表:create table book ( title char(15) not null, link varchar(50) COLLATE utf8_general_ci DEFAULT NULL);

6. 爬虫的结果如下:
{'link': [u'http://book.douban.com/subject/1885170/',
              u'http://book.douban.com/subject/1477390/',
              ……
              u'http://book.douban.com/subject/3288908/'],
           'title': [u'\u7b97\u6cd5\u5bfc\u8bba',
               ……
               u'\u96c6\u4f53\u667a\u6167\u7f16\u7a0b']}

由上面的爬取结果可以看出,爬取结果是字典嵌套一个列表。所以在写数据库的时候,for循环中item['title']表示字典的每个键对应的值,len(item['title']) 表示值的列表的长度。注意:如果写数据库不正确,数据库为空。
for i in range(len(item['title'])):
tx.execute('insert into book values (%s, %s)', (item['title'][i], item['link'][i])) 

7. 截图
爬虫抓取截图:

Scrapy抓取数据存入数据库(示例一)


爬取豆瓣编程第一页的截图:

Scrapy抓取数据存入数据库(示例一)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值