scrapy框架爬虫案例并将数据保存入库(附源码)

CrawlSpider

  • 继承自scrapy.Spider
  • CrawlSpider可以定义规则,再解析html内容的时候,可以根据链接规则提取出指定的链接,
  • 然后再向这些链接发送请求,所以,如果有需要跟进链接的需求,
  • 意思就是爬取了网页之后,需要提取链接再次爬取,使用CrawlSpider是非常合适的

1.创建项目(爬取读书网的书名和图片)

1.创建项目:scrapy  startproject  readbook

​2.跳转到spiders路径:cd  /readbook/readbook/spiders

​3.创建爬虫文件: scrapy  genspider  -t   crawl   read  https://www.dushu.com/book/1107_1.html

2.检查网页源代码,提取页码的正则表达式

在read.py中修改代码:

callback只能写函数名字符串, callback='parse_item'

在基本的spider中,如果重新发送请求,那里的callback写的是   callback=self.parse_item 

follow=true 是否跟进 就是按照提取连接规则进行提取
rules = (
    Rule(LinkExtractor(allow=r'/book/1107_\d+.html'),
         callback='parse_item',
         follow=True),
)

3.items的使用

在items.py文件中,添加代码

import scrapy
class ReadbookItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    src=scrapy.Field()
    name=scrapy.Field()

4.使用xpath提取元素

注意:在导入items.py文件需要注意一下:

from ..items import ReadbookItem

当爬取其他页时,URL地址会改变,如果不在allowed_domains中,就不能爬取,所以要修改allowed_domains中的URL地址,

allowed_domains = ['www.dushu.com']
start_urls = ['https://www.dushu.com/book/1107_1.html']
def parse_item(self, response):
    img_list =response.xpath('//div[@class="bookslist"]//img')
    for img in img_list:
        src=img.xpath('./@data-original').extract_first()
        name=img.xpath('./@alt').extract_first()
        book = ReadbookItem(src=src, name=name)
        yield book

5.在settings.py文件中添加数据库的配置

DB_HOST='127.0.0.1'
DB_PORT=3306
DB_USER='root'
DB_PASSWORD='root'
DB_NAME='spider'
DB_CHARSET='utf8'
并在数据库创建表read,创建字段 src(varchar(255)), name(varchar(255))

6.在pipelines.py文件中连接数据库

使用pymysql连接数据库,并使用管道将数据保存到数据库

pymysql的使用:
1. conn 连接
   1. 端口号必须是整型
   2. 字符集不允许加-
2. cursor 游标
3. cursor.execute(sql)
4. conn.commit()
5. cursor.close()
6. conn.close()
from scrapy.utils.project import get_project_settings
import pymysql

class SaveDataPipeline(object):
    def open_spider(self,spider):
        # 会把settings中的所有的等号左边的值当作key  等号右边的值当作value
        settings = get_project_settings()
        db_host = settings['DB_HOST']
        db_port = settings['DB_PORT']
        db_user = settings['DB_USER']
        db_password = settings['DB_PASSWORD']
        db_name = settings['DB_NAME']
        db_charset = settings['DB_CHARSET']

        self.conn = pymysql.Connect(host=db_host,
                                   user=db_user,
                                   password=db_password,
                                   database=db_name,
                                   # 端口号必须是整型
                                   port=db_port,
                                   # 字符集不允许加-
                                   charset=db_charset)
        self.cursor = self.conn.cursor()

    def process_item(self,item,spider):
        # {}的外面必须要加 “”
        sql = 'insert into `read` values ("{}","{}")'.format(item['src'],item['name'])
        self.cursor.execute(sql)
        self.conn.commit()
        return item

    def close_spider(self,spider):
        self.cursor.close()
        self.conn.close()

7.在settings.py文件中添加该管道

ITEM_PIPELINES = {
    # 'readbook.pipelines.ReadbookPipeline': 300,
    'readbook.pipelines.SaveDataPipeline': 299,
}

8.运行代码

使用命令:scrapy crawl read

9.最终爬取到的结果

在这里插入图片描述

源码已放在Github上,下载后只需修改数据库的userpassword,并创建对应的数据库,表和字段,安装依赖(requirements.txt)即可:github源码地址

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值