python爬虫--scrapy框架的学习和使用(七)⭐⭐⭐---第一部分


前言

  • 什么是框架?

就是一个集成了很多功能并且具有很强通用性的一个项目模板。

  • 如何学习框架?

专门学习框架封装的各种功能的详细用法。

  • 什么是scrapy?

爬虫中封装好的一个明星框架
功能

  • 高性能的持久化操作
  • 异步的数据下载操作
  • 高性能的数据解析操作
  • 分布式操作

一、scrapy框架的基本使用

  • 环境安装
linux和mac操作系统:pip install scrapy

windows系统:
pip install wheel
下载twisted,下载地址为http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
安装twisted:pip install Twisted‑17.1.0‑cp36‑cp36m‑win_amd64.whl
pip install pywin32
pip install scrapy
测试:在终端里录入scrapy指令,没有报错即表示安装成功!

1.1 windows下安装scrapy

  1. 安装wheel

pip install wheel

在这里插入图片描述

  1. 下载twisted
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 安装pywin32

pip install pywin32

在这里插入图片描述

  1. 安装scrapy

pip install scrapy

在这里插入图片描述

一开始安装失败,系统提示让我更新pip,更新pip后从新安装成功。

更新pip的命令:python -m pip install --upgrade pip

在这里插入图片描述

1.2 scrapy的基本使用

  • 步骤流程
  1. 通过终端指令创建一个工程:scrapy startproject xxxPro
  2. cd xxxPro
  3. 在spiders子目录中创建一个爬虫文件:scrapy genspider spiderName 域名
  4. 执行工程:scrapy crawl spiderName【不显示日志:scrapy crawl spiderName --nolog
  • 终端命令在VScode中演示
  1. 在这里插入图片描述
  2. 在这里插入图片描述

spiders文件里一定要放一个.py的爬虫文件

  1. 在这里插入图片描述
    在这里插入图片描述
  • 讲解scrapy创建的spiderName爬虫文件
import scrapy
class FirstSpider(scrapy.Spider):
    # 爬虫文件的名称 :就是爬虫源文件的唯一标识,即不能够重复
    name = 'first'
    # 允许的域名:用来限定start_urls列表中哪些url可以进行请求发送,一般该字段不用
    # allowed_domains = ['www.xxx.com'] 
    # 起使的url列表:该列表中存放的url会被scrapy自动进行请求的发送,可以有多个url
    start_urls = ['https://www.baidu.com/','https://www.sogou.com/']

    # 用于数据解析 response参数表示的就是请求成功之后对应的响应对象
    # parse方法调用的次数由start_urls中url的个数决定的
    def parse(self, response):
        pass  # 将print(response代替pass进行验证)

在这里插入图片描述

发现上述输出并没有有关start_urls中url的相关内容,修改settings.pyROBOTSTXT_OBEY = False

在这里插入图片描述

不显示日志:scrapy crawl spiderName --nolog
在settings.py中加入LOG_LEVEL ='ERROR',显示指定类型的日志信息

  • 对比信息
  1. 使用上述scrapy框架
    在这里插入图片描述
  2. 使用requests模块
import  requests 

if __name__ == "__main__":
    # 1. 指定url
    url = "https://www.sogo.com/"
    # 2. 发起请求  
    response = requests.get(url=url) 
    # get方法灰返回一个响应对象
    # 3. 获取相应数据 .text返回的是字符串形式的响应数据
    page_text = response
    print(page_text)

在这里插入图片描述


二、scrapy数据解析

scrapy框架的基本流程操作完毕后,一定要对settings.py文件进行如下操作:

  1. 修改USER_AGENT
  2. ROBOTSTXT_OBEY = False
  3. LOG_LEVEL = 'ERROR’
  • 爬取xx百科中的段子⭐⭐
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('//div[contains(@class,"col1")]/div')
        # print('div_list:',div_list)
        
        for div in div_list:
            # 所有的xpath返回的都是列表,但是列表元素一定是Selector类型的对象
            # extract()可以将Selector类型的对象中的字符串提取出来
            # author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
            # 如果保证返回的列表元素只有一个列表元素是可以使用extract_first()
            author = div.xpath('./div[1]/a[2]/h2/text()').extract_first()
            # 列表调用extract()表示将列表中每一个Selector对象中的字符串提取出来,并返回列表
            # 即列表调用extract()后返回还是列表
            content = div.xpath('./a[1]/div/span//text()').extract() # 由于有的标签中含有<br>标签,取所有内容用//

            content = ''.join(content)# 列表转换为字符串

            print(author, content)
            break # 只输出一次用来查看

  • 问题总结
  1. 遇到class中含有多个属性值

xpath如何取包含多个class属性


三、scrapy持久化存储

  • 基于终端指令
    要求:只可以将parse方法的返回值存储到本地的文本文件中【往数据库中存储是不行的】
  • 基于管道⭐⭐
  1. 数据解析
  2. 在Item类中定义相关的属性
  3. 将解析的数据封装到item类型的对象【使用items.py文件】
  4. 将Item类型对象提交给管道进行持久化存储操作
  5. 在管道类的process_item中呀将其接收到的item对象中存储的数据进行持久化存储操作【使用pipelines.py】
  6. 在配置文件中开启管道【scrapy默认情况是没有开启管道功能需要手动开启】

在这里插入图片描述

3.1 基于终端指令

例如第二章中爬取xx百科中的段子进行存储的代码如下:

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('//div[contains(@class,"col1")]/div')
        all_data = [] # 存储所有数据
        
        # print('div_list:',div_list)
        for div in div_list:
            # 所有的xpath返回的都是列表,但是列表元素一定是Selector类型的对象
            # extract()可以将Selector类型的对象中的字符串提取出来
            # author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
            # 如果保证返回的列表元素只有一个列表元素是可以使用extract_first()
            author = div.xpath('./div[1]/a[2]/h2/text()').extract_first()
            # 列表调用extract()表示将列表中每一个Selector对象中的字符串提取出来,并返回列表
            # 即列表调用extract()后返回还是列表
            content = div.xpath('./a[1]/div/span//text()').extract() # 由于有的标签中含有<br>标签,取所有内容用//

            content = ''.join(content)# 列表转换为字符串

          	dic = {
   
				'author':author,
				'content':content
			}
			all_data.append(dic)
			
		return all_data

现在可以通过终端指令对parse方法的返回值进行持久化存储

  • scrapy crawl qiubai -o ./qiubai.csvscrapy crawl spiderName -o filePpath
  • 注意:持久化存储的文件类型是有限制的

在这里插入图片描述

  • 结论
  • 优点: 简洁高效便捷
  • 缺点:局限性比较强(数据只能存储到指定文件中)

3.2 基于管道⭐⭐

使用管道进行爬取xx百科中的段子

现在根据流程进行一步一步的操作

  1. 数据解析

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('//div[contains(@class,"col1")]/div')
          
            for div in div_list:
                # 所有的xpath返回的都是列表,但是列表元素一定是Selector类型的对象
                # extract()可以将Selector类型的对象中的字符串提取出来
                # author = div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
                # 如果保证返回的列表元素只有一个列表元素是可以使用extract_first()
                author = div.xpath('./div[1]/a[2]/h2/text() ').extract_first()
                # 列表调用extract()表示将列表中每一个Selector对象中的字符串提取出来,并返回列表
                # 即列表调用extract()后返回还是列表
                content = div.xpath('./a[1]/div/span//text()').extract() # 由于有的标签中含有<br>标签,取所有内容用//

                content = ''.join(content)# 列表转换为字符串
				
				# 3. 将解析的数据封装到item类型的对象
                item = QiubaiproItem()
                # 获取值用[]而不是.  ⭐⭐
                item['author'] = author
                item['c
  • 60
    点赞
  • 357
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

胜天半月子

打不打商的无所谓,能帮到你就好

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

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

打赏作者

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

抵扣说明:

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

余额充值