14. python爬虫——基于scrapy框架爬取糗事百科上的段子内容

1、需求

爬取糗事百科上段子的作者名字和段子内容
https://www.qiushibaike.com/text/

2、分析及实现

首先,创建scrapy工程文件,在命令行上输入:
scrapy startproject qiubaiPro

然后,进入qiubaiPro文件,在命令行上输入:
cd qiubaiPro

之后再创建爬虫文件,在命令行上输入:
scrapy genspider qiubai www.xxx.com

settings.py中的部分内容改为:

USER_AGENT = 'Mozilla/......'

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

LOG_LEVEL='ERROR'

spiders文件夹下的qiubai.py进行修改

import scrapy


class QiubaiSpider(scrapy.Spider):
    name = 'qiubai'
#    allowed_domains = ['www.xxx.com']
    start_urls = ['https://www.qiushibaike.com/text/']

    def parse(self, response):
        #解析:作者的名称+段子的内容
        div_list = response.xpath('//*[@id="content"]/div/div[2]/div')
        print(div_list)
        for div in div_list:
            author = div.xpath('./div/a[2]/h2/text()').extract_first()
            content = div.xpath('./a[1]/div//text()').extract()
            content = ''.join(content)
            
            print(author,content)

知识点:python中join()函数的使用方法

进行爬取:
scrapy crawl qiubai

3、实现效果

在这里插入图片描述


4、进行持久化存储

(1)基于终端指令

将qiubai.py中的内容改为

import scrapy


class QiubaiSpider(scrapy.Spider):
    name = 'qiubai'
#    allowed_domains = ['www.xxx.com']
    start_urls = ['https://www.qiushibaike.com/text/']

    def parse(self, response):
        #解析:作者的名称+段子的内容
        div_list = response.xpath('//*[@id="content"]/div/div[2]/div')
        #存储所有解析到的数据
        all_data = []
        for div in div_list:
            #xpath返回的是列表,但是列表元素一定是Selector类型的对象
            #extract可以将Selector对象中data参数存储的字符串提取出来
            author = div.xpath('./div/a[2]/h2/text()').extract_first()
            #列表调用了extract之后,则表示将列表中每一个Selector对象中data对应的字符串提取了出来
            content = div.xpath('./a[1]/div//text()').extract()
            content = ''.join(content)
            
            dic = {
                    'author':author,
                    'content':content
            }
            
            all_data.append(dic)
            print(dic)
            return all_data

执行命令时输入scrapy crawl qiubai -o ./qiubai.csv
即可完成持久化存储。

(2)基于管道

编码流程:

  • 数据解析
  • 在item类中定义相关的属性
  • 将解析的数据封装存储到item类型的对象
  • 将item类型的对象提交给管道进行持久化存储的操作
  • 在管道类的process_item中要将其接收到的item对象中存储的数据进行持久化存储操作
  • 在配置文件中开启管道

好处:
通用性强

(1)在item中定义相关属性
items.py文件

import scrapy


class QiubaiproItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    author = scrapy.Field()
    content = scrapy.Field()

(2)解析数据,将解析到的数据存储到item类型的对象中,然后将其提交给管道

qiubai.py文件

import scrapy
from qiubaiPro.items import QiubaiproItem


class QiubaiSpider(scrapy.Spider):
    name = 'qiubai'
#    allowed_domains = ['www.xxx.com']
    start_urls = ['https://www.qiushibaike.com/text/']

    def parse(self, response):
            #解析:作者的名称+段子的内容
            div_list = response.xpath('//*[@id="content"]/div/div[2]/div')
            #存储所有解析到的数据
            all_data = []
            for div in div_list:
                #xpath返回的是列表,但是列表元素一定是Selector类型的对象
                #extract可以将Selector对象中data参数存储的字符串提取出来
                author = div.xpath('./div/a[2]/h2/text()').extract_first()
                #列表调用了extract之后,则表示将列表中每一个Selector对象中data对应的字符串提取了出来
                content = div.xpath('./a[1]/div//text()').extract()
                content = ''.join(content)
                
                item = QiubaiproItem()
                item['author'] = author
                item['content'] = content
                
                #将item提交给管道
                yield item

(3)在配置文件中开启管道,将接收到的item对象进行持久化存储

settings.py文件

ITEM_PIPELINES = {
    'qiubaiPro.pipelines.QiubaiproPipeline': 300,
    #300表示的是优先级,数值越小优先级越高
}

pipelines.py文件

from itemadapter import ItemAdapter


class QiubaiproPipeline:
    fp = None
    #重写父类的一个方法:该方法只在开始爬虫的时候被调用一次
    def open_spider(self,spider):
        print('开始爬虫......')
        self.fp = open('./qiubai.txt','w',encoding='utf-8')
        
    #专门用来处理item类型的对象
    #该方法可以接收爬虫文件提交过来的item对象
    #该方法每接收到一个item就会被调用一次
    def process_item(self, item, spider):
        author = item['author']
        content = item['content']
        
        self.fp.write(author+':'+content+'\n')
            
        return item


    def close_spider(self,spider):
        print('结束爬虫!')
        self.fp.close()

命令行上输入scrapy crawl qiubai
即可完成爬取并持久化存储工作

知识点:
python中的yield关键字是个什么鬼?它有什么用处?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰阳星宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值