Scrapy从青铜到王者第一篇:Scrapy理解
Posted J哥。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scrapy从青铜到王者第一篇:Scrapy理解相关的知识,希望对你有一定的参考价值。
什么是框架:就是一个集成了很多功能,并且具有很强的通用性的一个项目模板
如何学习框架: 专门学习框架封装的各种功能的详细用法
什么是scrapy :爬虫中封装好的一个明星框架。
功能: 学习计划.高性能持久化存储,异步的数据下载,高性能的数据解析,分布式
scrapy 框架的基本使用 :环境安装:-mac或者linux pip install scrapy
-win pip install wheel
-下载twisted:
-安装twisted:
-pip install pywin32
-pip install pywin32
测试 : 终端 输入 scrapy 没报错 说明安装成功
-创建一个工程: scrapy startproject 工程的名称
-cd 工程名称
再 scrapy genspider 爬虫文件名字随便写 + url 例如:scrapy genspider first www.xxx.com
scrapy.cfg 配置文件 目前用不到 spiders 爬虫文件夹或者为爬虫目录 里面一定要放入一个 爬虫源文件
pipelines.py 配置 settings.py工程的配置文件 经常使用
- 在spiders子目录 建立py文件 在里面写爬虫代码 :
再 scrapy genspider 爬虫文件名字随便写 + url 例如:scrapy genspider first www.xxx.com
- spiders genspider spiderName(就是py文件的名称随便起的) +起始的url
- 执行工程:
scrapy crawl py文件名称 clear清屏幕
干扰数据清除 : scrapy crawl py文件名称 --nolog
-- 数据解析 :糗百案例yiubaiPro
-- 持久化存储:
--基于终端指令:scrapy crawl py名字 -o 自定义保存的文件名 例如:scrapy crawl qiubai0 -o qiubai.csv
- 要求:只可以将parse方法的返回值存储到本地的文件中 不可以存到数据库 parse就是def parse(self, response)
- 注意: 持久化对应的文本文件类型只能是:('json', 'jsonlines', 'jl', 'csv', 'xml', 'marshal', 'pickle')
- 指令: scrapy crawl py名字 -o 自定义保存的文件名 例如:scrapy crawl qiubai -o qiubai.csv
- 好处: 简洁 高效 便捷
- 缺点: 局限性比较强(数据只能保存到指定文件格式中)
重 要点 --基于管道:
- 编码流程:
- 数据解析
- 在item类中定义相关属性
- 将解析的数据封装存储到item类型的对象中
- 将item类型的对象提交给管道进行持久化存储的操作 pipelines.py 翻译就是管道的意思
- 在管道类的process_item中要将其接收到的item对象中存储的数据进行持久化存储操作
- 在配置文件中开启管道
- 优点 : 通用性强。 存数据库什么的
# 基于终端存储 方式
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[@class="col1 old-style-col1"]/div')
for div in div_list:
# author content 不是返回值 是局部变量
all_data = [] # 存储所有解析到的数据
# author = div.xpath('./div[学习计划]/a[2]/h2/text()')[0].extract() # [0] 列表长度
author = div.xpath('./div[学习计划]/a[2]/h2/text()').extract_first()
# [0] 列表长度 一定要确定 该列表中只有一个列表元素才可以用extract_first() 将列表中第0个元素变成字符串
# 所有 xpath取回的都是列表 , 但是列表一定是Selector类型对象
# extract 可以将Selector 对象中data参数储存的字符串提取出来
content = div.xpath('./a[学习计划]/div/span//text()').extract()
# 现在本身就是列表 但是列表也能调用.extract() 但返回的是一个列表
# 列表调用.extract()之后,则表示将列表中每个Selector对象中的data对应的字符串提取出来
content = ''.join(content) # 列表转成字符串
# print(author, content)
dic = {
'author': author,
'content': content
}
all_data.append(dic)
return all_data
- 面试题 :将爬取的数据一份进行存储一份存入数据库,如何实现? 通过管道
- 将管道文件中一个管道类对应的是将数据存储到一个平台
- 爬虫文件提交的item只会给管道中的第一个被执行的管道类接收
- process_item中的reture item表示将item传递给下一个即将被执行的管道类
- 基于Spider的全站数据爬取 : 全站数据爬取就是:
- 就是将全网站中某板块下的全部页码对应得页面数据进行爬取
- 爬取校花网中得照片名称
- 实现方式:
- 将所有页面的url添加到 srart_urls列表当中 (不推荐使用)
- 自行手动进行请求发送(推荐)
- 手动请求发送 :
- yield yield scrapy.Request(url=new_url, callback=self.parse) :callback :专门用于数据解析的
-- 五大核心组件: 引擎 ,管道 ,引擎 ,下载器 ,spider ---》互联网
- spider --》引擎--》调度器--》过滤器
- spider --》引擎--》调度器--》队列
-- 请求传参:应用的非常广
--使用场景: 如果爬取解析的数据不在同一张页面中。(深度爬取)
--需求 :爬取boos的直聘的岗位名称和岗位描述
--我们爬取的解析数据不在同一个页面 就要用 请求传参
--图片爬取之ImagesPipeline 这是一个管道类 专门用于图片数据爬取 之前学的 都是用于字符串爬取
- 基于scrapy爬取字符串类型的数据爬取和爬取图片类型的数据区别:
- 字符串:只需要基于xpath进行解析 且提交管道进行持久化存储
- 图片类型:我们只可以通过xpath解析图片src的属性值.单独的对图片地址发起请求获取图片二进制类型的数据
- ImagesPipeline :
- 只需要将img的 属性值 src进行解析,提交给管道,管道就会对图片的src进行请求发送获取图片的二进制类型数据,且还会帮我们持久化存储
- 需求: 爬取站长素材中的高清图片
- 使用流程:
- 数据解析: 图片的地址
- 将存储图片地址的item提交到制定的管道类
- 在管道文件中制定一个基于ImagesPipeline的一个管道类
- get_media_resquest()
_ file_path()
- item_completed
- 在配置文件中操作:
- 制定图片存放目录: IMAGES_STORE = './img_Jg'
- 制定开启的管道:自定制的管道类
- 中间件:--->引擎和下载器之间: middlewares(中间件py文件)
- 位置: 下载中间件
- 作用: 批量拦截到整个工程中所有的请求和对象
- 拦截请求:
- 进行UA伪装(与配置文件中的不同):写在:process_request
- 代理ip的设定 :写在:process_exception :return request
- 拦截响应:
- 篡改响应数据,响应对象
- 需求: 爬取网易新闻中的新闻数据(爬取新闻的标题和新闻的内容)
= 1.通过网易新闻的首页解析出五大板块对应的详情页的url (没有动态加载)
- 2.每一个板块对应的新闻标题都是动态加载出来的(动态加载)
- 3.通过解析出每一条新闻详情页的url获取详情页的页面源码,解析出新闻内容
--->引擎和spider之间:爬虫中间件(应用场景太少)
- CrawlSpider:类,Spider的子类 继承父类所有的功能并且派生出自己的功能
- 全站数据爬取的方式:
- spider:手动请求发送
- 基于CrawlSpider:已经封装好全站爬取的包
- CrawlSpider的具体使用:
- 创建一个工程:
- 创建的爬虫文件(CrawlSpider):
创建指令: - scrapy genspider -t crawl 名称 加url 例如:sunPro>scrapy genspider -t crawl sun www.xxx.com
- 链接提取器:
- 作用:根据指定的规则(allow=r'正则表达式')进行连接的提取
- 规则解析器:
- 作用: 将链接提取器取到的链接进行指定规则(callback='parse_item')的解析
- 需求 :
- 爬取sun网站中的编号、新闻标题、新闻的内容、编号
- 分析: 爬取的数据不在同一张页面中。
- 1.使用链接提取器提取出页面所有链接
- 2.让链接提取器提取详情页的链接 (用两次)
以上是关于Scrapy从青铜到王者第一篇:Scrapy理解的主要内容,如果未能解决你的问题,请参考以下文章