第四章 Scrapy框架的简单使用 2021-10-25

爬虫系列总目录


Scrapy是用纯 Python 实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。安装命令 pip install scrapy

  1. scrapy基于事件的机制,异步存储方式极大的提高了爬虫的效率
  2. 配置简单,通过简单代码实现复杂爬虫

一、 常用命令

1.1. 全局命令

# 查看帮助(全部命令以及其描述) 
scrapy --help 
# 创建一个新的Scrapy项目(项目名不可以以数字开头) 
scrapy startproject <project_name> 
# 在当前文件夹或者当前项目,创建一个新的爬虫文件 
scrapy genspider example example.com 
# 运行一个爬虫文件 
scrapy runspider spider_name.py 
# 获取指定的URL,并且能够显示出获取的过程 
scrapy fetch url 
# 在浏览器中打开指定的URL 
scrapy view url 
# 查看Scrapy版本 参数-v会将关联模块一并输出 
scrapy version [-v]

1.2 项目命令

# 运行爬虫项目 
scrapy crawl xbqg(脚本名称)
# 测试本地硬件性能 
scrapy bench 
# 列出当前项目下的所有爬虫文件 
scrapy list

二、 创建项目文件

2.1 创建项目

scrapy startproject biquge

2.2 创建爬虫文件

cd biquge
# 创建scrapy爬虫文件
scrapy genspider xbqg www.xbiquge.la

三、 Scrapy核心架构

3.1 按功能划分

在这里插入图片描述

3.2 工作流程图

在这里插入图片描述

3.3 按文件介绍

---- scrapy.cfg 配置文件
---- 项目文件
---- ---- spiders 爬虫文件夹 爬虫代码文件
---- ---- pipelines.py 管道,将 item 字段文件中的字段进行持久化等操作
---- ---- setting 配置文件

四、 运行程序

4.1 爬虫脚本编写

  • response.xpath()利用xpath解析数据
  • extract() 返回一个包含有字符串的列表
  • extract_first() 返回列表中的第一个字符串,列表为空没有返回None

spider 文件夹内文件 xbqg.py

class XbqgSpider(scrapy.Spider):
    # 爬虫名必须唯一
    name = 'xbqg'
    # 允许的域名
    allowed_domains = ['www.xbiquge.la']
    # 开始采集的url
    start_urls = ['https://www.xbiquge.la/10/10489/']

    def parse(self, response):
        all_dd = response.xpath('//dl/dd')
        for dd in all_dd[1:11]:
            url = 'https://www.xbiquge.la'+dd.xpath('./a/@href').extract()[0]
            # 再次根据生成的url来调用callback参数后面的方法
            yield scrapy.Request(url=url, callback=self.parse_next)

    def parse_next(self, response):
        item = BiqugeItem()
        item['name'] = response.xpath("//div[@class='bookname']/h1/text()").extract()[0].replace(' ', '')
        item['content'] = ''.join(response.xpath("//*[@id='content']/text()").extract()).replace(u' ', '')
        yield item

4.2 基于管道的持久化

  • 在items.py文件中进行定义相关持久化属性
  • 在爬虫文件中将解析的数据存储到Item类型对象中
  • 将Items类型对象提交给管道
  • 在管道文件中,接受爬虫文件提交过来的Items类型
  • 对持久化数据进行自定义形式存储
  • 在配置文件中打开管道机制: ITEM_PIPELINES

items

# item的本质是字典
class BiqugeItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    # 章节名字
    name = scrapy.Field()
    # 章节内容
    content = scrapy.Field()

Pipelines

class BiqugePipeline:
    def process_item(self, item, spider):
        self.t = open('./book/{}.txt'.format(item['name']), 'w', encoding='utf-8')
        self.t.write(item['content'])
        return item

    def close_spider(self, spider):
        self.t.close()

4.3 修改Settings 设置

# Obey robots.txt rules
# 是否遵守robot协议
ROBOTSTXT_OBEY = False

BOT_NAME = 'biquge'

SPIDER_MODULES = ['biquge.spiders']
NEWSPIDER_MODULE = 'biquge.spiders'

#增加请求头User-Agent 防止反爬 
DEFAULT_REQUEST_HEADERS = {}


# 分配给每个类的整型值,确定了他们运行的顺序,item 按数字从低到高的顺序,通过pipeline,
# 通常将这些数字 定义在0-1000范围内(0-1000随意设置,数值越低,组件 的优先级越高)
ITEM_PIPELINES = {
   'biquge.pipelines.BiqugePipeline': 300,
}

使用命令行启动 scrapy crawl xbqg

4.4 从main 函数启动()

创建main.py 文件, 跟scrapy.cfg 在同一层级下。也是命令行。在pycharm中从main启动可以实现debug。

from scrapy import cmdline 
cmdline.execute('scrapy crawl xbqg'.split())

4.5 终端命令的数据持久化存储

# csv格式 
scrapy crawl xbqg -o meiju.csv 
# json格式,默认为Unicode编码 
scrapy crawl xbqg -o meiju.json 
# json lines格式,默认为Unicode编码 
scrapy crawl xbqg -o meiju.jsonl 
# xml格式 
scrapy crawl xbqg -o meiju.xml
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值