使用scrapy将爬取的数据一份保存在本地,一份保存在数据库中

1.需求:获取糗事百科的作者和段子

2.准备:

- 创建和使用 Scrapy 工程
	- `scrapy startproject qiubaiPro`
- 创建爬虫文件
	- cd qiubaiPro
	- scrapy genspider  qiubai www.xxx.com

在这里插入图片描述

3.代码展示

  • qiubai.py
import scrapy
from qiubaiPro.items import QiubaiproItem


class QiubaiSpider(scrapy.Spider):
    name = 'qiubai'
    allowed_domains = ['www.qiushibaike.com/']
    start_urls = ['http://www.qiushibaike.com/text/']
    
    def parse(self, response):
        div_list = response.xpath('//div[@class="col1 old-style-col1"]/div')
        for div in div_list:
            author = div.xpath('.//div[@class="author clearfix"]//h2/text()')[0].extract()#返回字符串
            content = div.xpath('.//div[@class="content"]/span//text()').extract()
            content = ''.join(content)
            # 将解析的数据封装存储到item类型的对象
            item = QiubaiproItem() # item类型的对象
            item['auto'] = author  # auto为items定义的属性
            item['cont'] = content
            yield item  # 将item提交给管道
           

  • items .py
import scrapy

class QiubaiproItem(scrapy.Item):
    # define the fields for your item here like:
    #定义属性
    auto = scrapy.Field()
    cont = scrapy.Field()

  • pipelines.py
import pymysql

#将数据存储到本地
class QiubaiproPipeline(object):
    fp = None
    #重写父类的一个方法:该方法只在开始爬虫的时候被调用一次
    def open_spider(self,spider):
        print('开始爬虫......')
        self.fp = open('./qiubai.txt','w',encoding='utf8')

    # process_item专门用来处理item类型对象
    # 该方法item参数可以接收爬虫文件提交的item对象
    # 该方法每接收到一个item就会被调用一次
    def process_item(self, item, spider):
        author = item['auto']
        content = item['cont']
        self.fp.write(author+':'+content+'\n')
        return item  # 这个item会传递给下一个即将被执行的管道类
    def close_spider(self,spider):
        print('结束爬虫')
        self.fp.close()
class mysqlPipeline(object):
    conn = None
    cursor = None
    def open_spider(self,spider):
        # 1.建立连接
        self.conn = pymysql.connect(host="localhost", port=3306, database="qiubai",
                   user="root", password="123456", charset="utf8")
    def process_item(self,item,spider):
        # 2.创建cursor对象
        self.cursor = self.conn.cursor()
        try:
            # 3.操作数据
            self.cursor.execute('insert into qiubai values("%s","%s")' % (item["auto"], item["cont"]))
            # 提交之前的操作
            self.conn.commit()
        except Exception as e:
            print(e)
            self.conn.rollback()
    def close_spider(self,spider):
        self.cursor.close()
        self.conn.close()

# 问题:爬虫文件只传过来了一个item,会传递给哪一个管道类?
# 答:会传递个优先级高的管道类,
# 如果后面的管道也需要item,那么优先级高的需要return item
  • setting.py
    在这里插入图片描述
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值