写点什么

【❤️爬虫必备 ->Scrapy 框架从黑铁到王者❤️】初篇——万字博文详解 (建议收藏)

作者:孤寒者
  • 2022 年 6 月 06 日
  • 本文字数:5136 字

    阅读完需:约 17 分钟

【❤️爬虫必备->Scrapy框架从黑铁到王者❤️】初篇——万字博文详解(建议收藏)
  1. 👻👻相信不少小伙伴们在经历过我的上几篇关于爬虫技术的万字博文的轮番轰炸后,已经可以独立开发出属于自己的爬虫项目!!!——爬虫之路,已然开启!👻👻 


  1. 😬😬但是 前几日有很多粉丝私聊我反馈说:"自己爬虫基础库已经学差不多了,实战也做了不少,但是好多自己接的爬虫单或者老板都要求使用 scrapy 框架来爬取数据,自己没有接触过 scrapy 框架不知道如何下手!"😬😬


  1. ⏰⏰所以应粉丝们要求,本博主花了假期周六周日两天时间,肝出本文(共分上中下三篇),目的在于带领想要学习 scrapy 的同学走近 scrapy 的世界!并在文末附带一整套 scrapy 框架学习路线,如果你能认认真真看完这三篇文章,在心里对 scrapy 有个印象,然后潜心研究文末整套学习路线,那么,scrapy 框架对你来说——手到擒来!!!⏰⏰


  1. 🔩🔩我会尽量把技术文写的通俗易懂/生动有趣,保证每一个想要学习知识 &&认认真真读完本文的读者们能够<font color=buff>有所获,有所得。当然,如果你读完感觉本文写的还可以,真正学习到了东西,希望给我个「 赞 」 和 「 收藏 」,这个对我很重要,谢谢了!🔩🔩




下面就让我们一同走入 scrapy 的神奇世界!




🎅第一部分:走近 scrapy!

🍏0.简介及安装

1️⃣简介:

scrapy 设计目的:用于爬取网络数据,提取结构性数据的框架,其中,scrapy 使用了 Twisted 异步网络框架,大大加快了下载速度!


官方文档地址!!!


2️⃣安装:

直接 pip 安装(一句命令 &&一步到位):


pip install scrapy
复制代码


🍒1.scrapy 项目开发流程:

  1. 创建项目:scrapy startproject mySpider

  2. 生成一个爬虫:scrapy genspider baidu baidu.com

  3. 提取数据:根据网站结构在 spider 中实现数据采集相关内容

  4. 保存数据:使用 pipeline 进行数据后续处理和保存 

🍓2.scrapy 框架运行流程:


说明——scrapy 中每个模块的具体作用!



原理描述:


  1. 爬虫中起始的 url 构造的 url 对象-->爬虫中间件-->引擎-->调度器

  2. 调度器把 request-->引擎-->下载中间件-->下载器

  3. 下载器发送请求,获取 response 响应--->下载中间件--->引擎-->爬虫中间件--->爬虫

  4. 爬虫提取 url 地址,组装成 request 对象--->爬虫中间件--->引擎--->调度器,重复步骤 2

  5. 爬虫提取数据--->引擎--->管道处理和保存数据


注意:爬虫中间件和下载中间件只是运行的逻辑的位置不同,作用是重复的:如替换 UA 等!


🍌拓展——scrapy 中三个内置对象:

三个内置对象:(scrapy 框架中只有三种数据类型)


   request请求对象:由url,method,post_data,headers等构成;   response响应对象:由url,body,status,headers等构成;   item数据对象:本质是一个字典。
复制代码


🎍第二部分:创建 &&运行你的第一个 scrapy 项目!

🐱1.创建项目:

创建scrapy项目的命令:scrapy startproject <项目名字>示例:
复制代码


scrapy startproject myspider
复制代码


生成的目录和文件结果如下:



🐹2.爬虫文件的创建:

在项目根路径下执行:


 scrapy genspider <爬虫名字> <允许爬取的域名>
复制代码


示例:


cd myspiderscrapy genspider itcast itcast.cn
复制代码


讲解:


  • 爬虫名字:作为爬虫运行时的参数;

  • 允许爬的域名:为对于爬虫设置的爬取范围,设置之后用于过滤要爬取的 url,如果爬取的 url 与允许的域名不同,则被过滤掉。 

🐸3.运行 scrapy 爬虫:

命令:在项目目录下执行:scrapy crawl <爬虫名字>


示例:


scrapy crawl itcast
复制代码


不过,在运行之前,我们先要编写 itcast.py 爬虫文件:


# -*- coding: utf-8 -*-import scrapy

class ItcastSpider(scrapy.Spider): # 爬虫运行时的参数 name = 'itcast' # 检查允许爬的域名 allowed_domains = ['itcast.cn'] # 1.修改设置起始的url start_urls = ['http://www.itcast.cn/channel/teacher.shtml#ajacaee']
# 数据提取的方法:接收下载中间件传过来的response,定义对于网站相关的操作 def parse(self, response): # 获取所有的教师节点 t_list = response.xpath('//div[@class="li_txt"]') print(t_list) # 遍历教师节点列表 tea_dist = {} for teacher in t_list: # xpath方法返回的是选择器对象列表 extract()方法可以提取到selector对象中data对应的数据。 tea_dist['name'] = teacher.xpath('./h3/text()').extract_first() tea_dist['title'] = teacher.xpath('./h4/text()').extract_first() tea_dist['desc'] = teacher.xpath('./p/text()').extract_first() yield teacher
复制代码


然后再运行,会发现已经可以正常运行!



🐻4.明确了爬虫所爬取数据之后,使用管道进行数据持久化操作:

修改 itcast.py 爬虫文件:


# -*- coding: utf-8 -*-import scrapyfrom ..items import UbuntuItem

class ItcastSpider(scrapy.Spider): # 爬虫运行时的参数 name = 'itcast' # 检查允许爬的域名 allowed_domains = ['itcast.cn'] # 1.修改设置起始的url start_urls = ['http://www.itcast.cn/channel/teacher.shtml#ajacaee']
# 数据提取的方法:接收下载中间件传过来的response,定义对于网站相关的操作 def parse(self, response): # 获取所有的教师节点 t_list = response.xpath('//div[@class="li_txt"]') print(t_list) # 遍历教师节点列表 item = UbuntuItem() for teacher in t_list: # xpath方法返回的是选择器对象列表 extract()方法可以提取到selector对象中data对应的数据。 item['name'] = teacher.xpath('./h3/text()').extract_first() item['title'] = teacher.xpath('./h4/text()').extract_first() item['desc'] = teacher.xpath('./p/text()').extract_first() yield item
复制代码


注意:


  • scrapy.Spider 爬虫类中必须有名为 parse 的解析;

  • 如果网站结构层次比较复杂,也可以自定义其他解析函数;

  • 在解析函数中提取的 url 地址如果要发送请求,则必须属于 allowed_domains 范围内,但是 start_urls 中的 url 地址不受这个限制;

  • 启动爬虫的时候注意启动的位置,是在项目路径下启动;

  • parse()函数中使用 yield 返回数据,注意:解析函数中的 yield 能够传递的对象只能是:BaseItem, Request, dict, None。


小知识点 1——定位元素以及提取数据、属性值的方法:(解析并获取 scrapy 爬虫中的数据: 利用 xpath 规则字符串进行定位和提取)


  • response.xpath 方法的返回结果是一个类似 list 的类型,其中包含的是 selector 对象,操作和列表一样,但是有一些额外的方法;

  • 额外方法 extract():返回一个包含有字符串的列表;

  • 额外方法 extract_first():返回列表中的第一个字符串,列表为空没有返回 None。


小知识点 2——response 响应对象的常用属性:


  • response.url:当前响应的 url 地址

  • response.request.url:当前响应对应的请求的 url 地址

  • response.headers:响应头

  • response.requests.headers:当前响应的请求头

  • response.body:响应体,也就是 html 代码,byte 类型

  • response.status:响应状态码


🐮5.管道保存数据

在 pipelines.py 文件中定义对数据的操作!


  1. 定义一个管道类;

  2. 重写管道类的 process_item 方法;

  3. process-item 方法处理完 item 之后必须返回给引擎。

♥️初级篇:

♥️进阶篇:

# 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.htmlimport json

class UbuntuPipeline(object):
def __init__(self): self.file = open('itcast.json', 'w', encoding='utf-8')
def process_item(self, item, spider): # 将item对象强制转为字典,该操作只能在scrapy中使用 item = dict(item) # 爬虫文件中提取数据的方法每yield一次,就会运行一次 # 该方法为固定名称函数 # 默认使用完管道,需要将数据返回给引擎 # 1.将字典数据序列化 '''ensure_ascii=False 将unicode类型转化为str类型,默认为True''' json_data = json.dumps(item, ensure_ascii=False, indent=2) + ',\n'
# 2.将数据写入文件 self.file.write(json_data)
return item
def __del__(self): self.file.close()
复制代码


🐒6.settings.py 配置启用管道:

在 settings 文件中,解封代码,说明如下:



🐫7.scrapy 数据建模与请求:

(通常在做项目的过程中,在 items.py 中进行数据建模!)

💊(1)为什么建模?

  1. 定义 item 即提前规划好哪些字段需要抓,防止手误,因为定义好之后,在运行过程中,系统会自动检查,值不相同会报错;

  2. 配合注释一起可以清晰的知道要抓取哪些字段,没有定义的字段不能抓取,在目标字段少的时候可以使用字典代替;

  3. 使用 scrapy 的一些特定组件需要 Item 做支持,如 scrapy 的 ImagesPipeline 管道类。

💊(2)本项目中实操:

在 items.py 文件中操作:


# Define here the models for your scraped items## See documentation in:# https://docs.scrapy.org/en/latest/topics/items.html
import scrapy

class UbuntuItem(scrapy.Item): # 讲师名字 name = scrapy.Field() # 讲师职称 title = scrapy.Field() # 讲师座右铭 desc = scrapy.Field()
复制代码


注意:


  1. from ..items import UbuntuItem 这一行代码中 注意 item 的正确导入路径,忽略 pycharm 标记的错误;

  2. python 中的导入路径要诀:从哪里开始运行,就从哪里开始导入。 

🏃8.设置 user-agent:

# settings.py文件中找到如下代码解封,并加入UA:# Override the default request headers:DEFAULT_REQUEST_HEADERS = {  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',  'Accept-Language': 'en',  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36',}
复制代码


🔮9.到目前为止,一个入门级别的 scrapy 爬虫已经 OK 了,基操都使用了!

如何 run 呢?

现在 cd 到项目目录下,输入


scrapy crawl itcast
复制代码


即可运行 scrapy!



🐱10.开发流程总结:

  1. 创建项目:scrapy startproject 项目名

  2. 明确目标:在 items.py 文件中进行建模!

  3. 创建爬虫:

  4. 创建爬虫:  scrapy genspider 爬虫名 允许的域名完成爬虫:  修改 start_urls; 检查修改 allowed_domains; 编写解析方法!

  5. 保存数据:在 pipelines.py 文件中定义对数据处理的管道在 settings.py 文件中注册启用管道

结语:

  通过上面的学习,你已经可以独立创建一个 scrapy 项目并使用此框架进行简单的爬虫项目编写。但是!任何一种功夫都不是一下就能学好学会学精的!所以下面分享一波 scrapy 学习路线,只要你跟着潜心学完,那么!恭喜你!你已经是名优秀的 scrapy 框架使用者了!!!


下面是整套 scrapy 学习路线,其实就是我开篇说到的那个专栏,想要好好学习的可以去好好看看哦!


  1. 学习爬虫之 Scrapy 框架学习(1)---Scrapy 框架初学习及豆瓣 top250 电影信息获取的实战!

  2. 学习爬虫之 Scrapy 框架学习(2)---豆瓣 top250 电影更加详细的信息获取及 txt 文本存储外加 settings.py 配置文件的学习!

  3. 学习爬虫之 Scrapy 框架学习(3)---豆瓣 top250 电影完整版信息获取及如何存储到 mysql 数据库;Scrapy shell 和 Scrapy 选择器;使用到日志的学习!

  4. 学习爬虫之 Scrapy 框架学习(4)--CrawlSpider 的学习及实战纵横小说信息获取并储存 mysql;LinkExtractor 类和 Rule 类;Response 和 Request

  5. 学习爬虫之 Scrapy 框架学习(五)--中间件的学习及使用

  6. 学习爬虫之 Scrapy 框架学习(六)--1.直接使用 scrapy;使用 scrapy 管道;使用 scrapy 的媒体管道类进行猫咪图片存储。媒体管道类学习。自建媒体管道类存储图片

  7. 学习爬虫之 Scrapy 框架学习(七)---Scrapy 框架里使用分布式爬虫(Scrapy_redis)。分布式实战豆瓣电影信息爬取;使用 scrapyd 实现项目部署

  8. 学习爬虫之 Scrapy 框架学习(八)---Scrapy 框架里使用分布式爬虫;分布式实战纵横小说爬取+项目完整源码!

  9. scrapy-redis 分布式总结及升华(基础知识;原理分析;第三方组件讲解;实战[普通爬虫改造为分布式爬虫为例];scrapy_splash 组件的使用;日志信息与配置;scrapyd 部署项目)

  10. Scrapy 中 selenium 的应用-----并通过京东图书书籍信息爬取项目进行实操!

🔆第三部分——In The End!


从现在做起,坚持下去,一天进步一小点,不久的将来,你会感谢曾经努力的你!


本博主会持续更新爬虫基础分栏及爬虫实战分栏,认真仔细看完本文的小伙伴们,可以点赞收藏并评论出你们的读后感。并可关注本博主,在今后的日子里阅读更多爬虫文!


如有错误或者言语不恰当的地方可在评论区指出,谢谢!如转载此文请联系我征得本人同意,并标注出处及本博主名,谢谢 !

发布于: 2022 年 06 月 06 日阅读数: 26
用户头像

孤寒者

关注

同名微信公众号【孤寒者】 2021.11.09 加入

HDZ核心组成员 华为云享专家、Python全栈领域博主 CSDN原力计划作者、CSDN全栈领域优质创作者 专注分享Python领域原创系列文章,如Python爬虫、Django、tornado、flask等。

评论

发布
暂无评论
【❤️爬虫必备->Scrapy框架从黑铁到王者❤️】初篇——万字博文详解(建议收藏)_爬虫_孤寒者_InfoQ写作社区