Scrapy入门:爬取古诗文

Scrapy框架介绍

写一个爬虫需要做很多事情,比如:发送请求,数据解析,数据存储,反爬虫机制(更换代理,设置请求头等),异步请求。这些工作如果每次都要从头开始,使很浪费时间得。scrapy 把一些基础的东西都封装了,在它上面写爬虫可以更加高效。
经典

  1. Scrapy Engine(引擎) :框架的核心,负责在各组件之间进行通信,传递数据等。

  2. Spider(爬虫):发送那个需要爬取的链接给引擎,最后引擎把其他模块请求回来的数据在发送给爬虫,爬虫就去解析想要的数据。用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。 用户也可以从中提取出链接,让Scrapy继续抓取下一个页面。这个部分使我们开发者自己写的,因为要爬取的链接,页面中的数据都是自己来决定的。

  3. Scheduler(调度器): 复制接受引擎发送过来的请求,并按照一定的方式去进行排列和整理,负责调度请求的顺序等。就是一个 url 排序队列,有他决定下一个网址是啥,同时去重。

  4. Downloader(下载器): 复制接受引擎传过来的下载请求,然后去网络上下载相应的数据在交还给引擎。

  5. item Pipeline(管道): 负责将Spider 传递过来的数据(实体items) 进行保存,具体保持在哪有开发者决定

  6. Downloader Middlewares(下载中间件): 可以扩展下载器和引擎之间的通信功能的中间件。加个代理之类的

  7. Spider Middlewares(spider 中间件): 可以扩展引擎和爬虫之间通信功能的中间件

太有才了这个人

1.引擎:Hi!Spider, 你要处理哪一个网站?
2.Spider:老大要我处理xxxx.com(初始URL)。
3.引擎:你把第一个需要处理的URL给我吧。
4.Spider:给你,第一个URL是xxxxxxx.com。
5.引擎:Hi!调度器,我这有request请求你帮我排序入队一下。
6.调度器:好的,正在处理你等一下。
7.引擎:Hi!调度器,把你处理好的request请求给我。
8.调度器:给你,这是我处理好的request
9.引擎:Hi!下载器,你按照老大的下载中间件的设置帮我下载一下这个request请求。
10.下载器:好的!给你,这是下载好的东西。(如果失败:sorry,这个request下载失败了。然后引擎告诉调度器,这个request下载失败了,你记录一下,我们待会儿再下载)
11.引擎:Hi!Spider,这是下载好的东西,并且已经按照老大的下载中间件处理过了,你自己处理一下(注意!这儿responses默认是交给def parse()这个函数处理的)
12.Spider:(处理完毕数据之后对于需要跟进的URL),Hi!引擎,我这里有两个结果,这个是我需要跟进的URL,还有这个是我获取到的Item数据。
13.引擎:Hi !管道 我这儿有个item你帮我处理一下!调度器!这是需要跟进URL你帮我处理下。然后从第四步开始循环,直到获取完老大需要全部信息。
14.管道、调度器:好的,现在就做!

创建项目

  • 创建项目:通过命令来实现,首先进入到你想把这个项目想存放的目录,然后使用scrapy startproject gushiwen
  • 创建爬虫:scrapy genspider[爬虫名][爬虫作用的域名] scrapy genspider gushiwen_spider gushiwen.org
    在这里插入图片描述
    是中间件不是中介器哈哈哈,,,,,,,

案例:爬取古诗文网

一股文学的味道
- 首先来看一下 settings.py 这个项目配置文件

BOT_NAME:项目名

USER_AGENT:默认是注释的,这个东西非常重要,如果不写很容易被判断为电脑,简单点写一个Mozilla/5.0即可

ROBOTSTXT_OBEY:是否遵循机器人协议,默认是true,需要改为false,否则很多东西爬不了

CONCURRENT_REQUESTS:最大并发数,很好理解,就是同时允许开启多少个爬虫线程

DOWNLOAD_DELAY:下载延迟时间,单位是秒,控制爬虫爬取的频率,根据你的项目调整,不要太快也不要太慢,默认是3秒,即爬一个停3秒,设置为1秒性价比较高,如果要爬取的文件较多,写零点几秒也行

COOKIES_ENABLED:是否保存COOKIES,默认关闭,开机可以记录爬取过程中的COKIE,非常好用的一个参数

DEFAULT_REQUEST_HEADERS:默认请求头,上面写了一个USER_AGENT,其实这个东西就是放在请求头里面的,这个东西可以根据你爬取的内容做相应设置

ITEM_PIPELINES:项目管道,300为优先级,越低越爬取的优先度越高

在这里插入图片描述
配置settings 文件,,这两个是必须要改的

# -*- coding: utf-8 -*-
import scrapy
 # 要去终端运行。。。

class GushiwenSpiderSpider(scrapy.Spider):
    name = 'gushiwen_spider'
    allowed_domains = ['gushiwen.org']          # 允许的域名
    start_urls = ['https://www.gushiwen.org/default_1.aspx']       # 开始的url ,也可以指定多个
 # 在代码跑起来后就会自动发送请求了,,,,,厉害啊
    
    def parse(self, response):
        print(response.text)

如果让代码跑起来就要去终端运行,
在这里插入图片描述
相关指令可以去看看这篇博客啊脑部链接

但是这么搞肯定是不行的。。。。。

可以在主文件下放一个run.py的文件(名字随意),这样就可以调用我的爬虫了

from scrapy import cmdline   # 代表了命令行

cmdline.execute('scrapy crawl gushiwen_spider'.split(' '))
# 相当于传入 cmds['scrapy','crawl','gushiwen_spider']

数据解析

如果我们要使用xpath 不用去导入库,在 response 这个对象里已经内置了,可以通过源代码查看
在这里插入图片描述

完整过程:

  1. 创建项目:
scrapy startproject gushiwen
cd gushiwen
scrapy genspider gushiwen_spider gushiwen.org
  1. 修改setting
    修改三项 第一个不遵守机器人协议,第二个请求头,第三个打开管道
ITEM_PIPELINES = {
   'gushiwen.pipelines.GushiwenPipeline': 300, # 优先级,值越低优先级越高,可能会有多个管道
}          # 记得在 setting 中把这个打开。。。。。。。。
  1. 确认需要提取的数据: item

item定义你要提取的内容(定义数据结构),比如我提取的内容为标题和内容,我就创建两个变量。Field方法实际上的做法是创建一个字典,给字典添加一个建,暂时不赋值,等待提取数据后再赋值。下面item的结构可以表示为:{‘name’:’’,‘descripition’:’’}。

import scrapy

class GushiwenItem(scrapy.Item):
    title = scrapy.Field()  # 定义好我们需要抓取的字段
    content = scrapy.Field()
  1. 写爬虫程序
    我们要写的部分就是parse方法里面的内容,引入写好的item. 对item里面建立的变量进行赋值,后交给管道处理
# -*- coding: utf-8 -*-
import scrapy
from ..items import GushiwenItem   # 从上一层导入我们定义好的item

class GushiwenSpiderSpider(scrapy.Spider):
    name = 'gushiwen_spider'
    allowed_domains = ['gushiwen.org']          # 允许的域名
    start_urls = ['https://www.gushiwen.org/default_1.aspx']

    def myprint(self,value):      # 只是为了好看
        print(value)
        print('='*30)

    def parse(self, response):
        self.myprint(type(response))
        # print(response.text)

        divs = response.xpath('//div[@class="left"]/div[@class="sons"]')
        # print(type(divs))   # output:<class 'scrapy.selector.unified.SelectorList'> 是一个选择器列表
        for div in divs:  # 在这个框架中,用xpath 提取出来的每个对象都是一个选择器,selector对象
            # 对于这些选择器对象,也都内置了xpath re css 这些方法去提取数据。。。
            title = div.xpath('.//b/text()').getall()
            # 也是返回 selectorlist 对象,使用该方法获得真正的数据返回列表,get()方法返回第一个数据
            content = div.xpath('.//div[@class="contson"]//text()').getall()
            content = ''.join(content).strip()
            items = GushiwenItem(title = title,content = content) # 赋值
            yield items       # 将数据传递到管道,pipelines

        next_href = response.xpath('//a[@id="amore"]/@href').get() # 获取下一页的部分url
        if next_href:  # 到最后一页就停止
            next_url = response.urljoin(next_href)      # 自动把域名补充上去
            request = scrapy.Request(next_url)
            yield request    # 自动发给调度器,再次发送请求

yield:可以看看我以前写的啊

yield items 的作用就是移交控制权,在我们对items 数据赋值后,调用yield 把控制权交给管道,管道经过处理再return回来这个程序,再yield 处继续运行。

第二个yield request : 回调,对象时parse,当前方法,如果不附加条件就是死循环,

  1. 交给管道输出
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html # 官方的帮助文档
import json

class GushiwenPipeline(object):
    def open_spider(self,spider):         # 再爬虫运行时调用这个函数,再上面的链接查到的。。。
        self.f = open('古诗文.txt','w',encoding='utf-8')

    def process_item(self, item, spider):        # 数据不会一次过来,一个一个来的
        self.f.write(json.dumps(dict(item),ensure_ascii=False)+'\n')    # 变成json 格式写入,json只接受字典。。。
        return item                  # 当你的项目由多个pipelines 通过这个传给下一个管道

    def close_spider(self,spider):
        self.f.close()
  1. 执行项目
from scrapy import cmdline   # 代表了命令行

cmdline.execute('scrapy crawl gushiwen_spider'.split(' '))
# 相当于传入 cmds['scrapy','crawl','gushiwen_spider']

其实感觉也不是很难不是,,,,,,,,,,,,,,,感谢大佬的文章啊脑部链接

在这里插入图片描述
这首小诗不错啊,,,,,

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值