爬虫学习笔记03-Scrapy框架

爬虫学习笔记03-Scrapy框架

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

Scrapy:爬虫中封装好的一个明星框架。功能:高性能的持久化存储,异步的数据下载,高性能的数据解析,分布式

环境的安装:
-mac or linux: pip install scrapy
-windows:
	-pip install wheel
	-下载并安装twisted:			https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

pip install 下载的whl文件名
-pip install pywin32
-pip install scrapy
测试:在终端里录入scrapy指令,没有报错即表示安装成功。
-创建一个工程:scrapy startproject xxxPro
-cd xxxPro
-在spiders子目录中创建一个爬虫文件
	-scrapy genspider spiderName www.xxx.com
执行工程:
	-scrapy crawl spiderName
scrapy数据解析

-scrapy持久化存储
-基于终端指令:
-要求:只可以将parse方法的返回值存储到本地的文本文件中
-注意:持久化存储对应的文本文件的类型只可以为:‘json’,‘jsonlines’,‘csv’,‘xml’
-指令: scrapy crawl xxx -o filePath
-好处:简洁高效便捷
-缺点:局限性比较强(数据只可以存储到指定后缀的文本文件中)
-基于管道:
-编码流程:
-数据解析
-在item类中定义相关的属性
-将解析的数据封装存储到Item类型的对象
-将item类型的对象提交给管道进行持久化存储的操作
-在管道类的process_item中要将其接受到的Item对象中存储的数据进行持久化存储操作。
-在配置文件中开启管道

​ 好处:通用性强。
​ 缺点:编码流程繁琐
​ -面试题:将爬取到的数据一份存储到本地一份存储到数据库
​ -管道文件中的一个管道类对应的是将数据存储到一种平台
​ -爬虫文件提交的item只会给管道文件中第一个被执行的管道类接收
​ -process_item中的return item表示将item传递给下一个即将被执行的管道类

import scrapy
#需求:获取糗事百科中的段子
class QiubaiSpider(scrapy.Spider):
    name = 'qiubai'
    #allowed_domains = ['www.xxx.com']
    start_urls = ['http://www.qiushibaike.com/text/']

    def parse(self, response):
        #解析:作者的名称+段子内容
        div_list=response.xpath('//*[@class="col1 old-style-col1"]/div')
        for div in div_list:
            #xpath返回的是列表,但是列表元素一定是Selector类型的对象
            #extract可以将Selector对象中data参数存储的字符串提取出来
            #author=div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
            author = div.xpath('./div[1]/a[2]/h2/text()').extract_first()
            #列表调用了extract之后,则表示将列表中每一个Selector对象中data对应的字符串提取了出来
            content=div.xpath('./a[1]/div/span//text()').extract()
            content = ''.join(content)
            print(author,content)
基于spider的全站数据爬取

-就是将网站中某板块下的全部页码对应的页面数据进行爬取
-需求:爬取校花网中的图片的名称
-实现方法:
-将所有页面的Url添加到start_urls列表(不推荐)
-自行手动进行请求发送(推荐)
-手动请求发送:
yield scrapy.Request(url,callback):callback专门用作于数据解析

import scrapy
class XiaohuaSpider(scrapy.Spider):
    name = 'xiaohua'
    start_urls=['http://www.521609.com/meinvxiaohua/']
    #生成一个通用的url模板
    url='http://www.521609.com/meinvxiaohua/list12%d.html'
    page_num=2
    def parse(self,response):
        li_list=response.xpath('/html/body/div[4]/div[2]/div[2]/ul/li')
        for li in li_list:
            img_name=li.xpath('./a[2]/b/text()').extract_first()
            print(img_name)
        if self.page_num<=4:
            new_url=format(self.url%self.page_num)
            self.page_num+=1
            #手动请求发送:callback回调函数是专门用作于数据解析
            yield scrapy.Request(url=new_url,callback=self.parse)
五大核心组件
引擎(Scrapy)

用来处理整个系统的数据流处理,触发事务(框架核心)

调度器(Scheduler)

用来接收引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。可以想象成一个url。

下载器(Downloader)

用于下载网页内容,并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)

爬虫(Spiders)

爬虫是主要干活的,用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。用户也可以从中提取数据。

项目管道(Pipeline)

负责处理爬虫从网页中抽取的实体,主要功能是持久化实体、验证实体的有效性、清除不需要的信息。

ImagesPipeline
基于scrapy爬取字符串类型的数据和爬取图片类型的数据区别?

​ -字符串:只需要基于xpath进行解析且提交管道进行持久化存储
​ -图片:xpath解析出图片的src的属性值。单独的对图片地址发起请求获取图片二进制类型的数据

ImagesPipeline:

​ -只需要将img的src的属性值进行解析,提交到管道,管道就会对图片的src进行请求发送获取图片的二进制类型的数据,且还会帮我们进行持久化存储。

-需求:爬取站长素材中的高清图片
-使用流程:
-数据解析(图片的地址)
-将存储图片地址的item提交到指定的管道类
-在管道文件中自定制衣柜基于ImagesPipeLine的一个管道类
-get_media_request
-file_path
-item_completed
-在配置文件中:
-指定图片存储的目录:IMAGES_STORE=‘./imgs_bobo’
-指定开启的管道:自定制的管道类

中间件

-下载中间件:
-位置:引擎和下载器之间
-作用:批量拦截到整个工程中发起的所有的请求和响应
-拦截请求:
-UA伪装:process_request
-代理IP:process_exception:return request
-拦截响应:
-篡改响应数据或者响应对象
-需求:爬取网易新闻中的新闻数据(标题和内容)
-1.通过网易新闻的首页解析出五大板块对应的详情页url(没有动态加载)
-2.每一个板块对应的新闻标题都是动态加载出来的(动态加载)
-3.通过解析出每一条新闻详情页的Url获取详情页的页面源码,解析出新闻内容

CrawlSpider

类,Spider的一个子类
全站数据爬取的方式
-基于Spider:手动请求
-基于CrawlSpider
CrawlSpider的使用:
-创建一个工程
-cd XXX
-创建爬虫文件(CrawlSpider):
-scrapy genspider -t crawl xxx www.xxx.com
-链接提取器:
-作用:根据指定的规则(allow)进行指定链接的提取
-规则解析器:
-作用:将链接提取器提取到的链接进行指定规则(callback的解析)

需求:爬取sun网站的编号新闻标题、新闻内容,标号

​ -分析:爬取的数据没有在同一张页面中。
​ -1.可以使用链接提取器提取所有的页码链接
​ -2.让链接提取器提取所有的新闻详情页的链接

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

RWLinno

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

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

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

打赏作者

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

抵扣说明:

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

余额充值