首页 > 其他分享 >Scrapy入门到放弃01:我为什么选择Scrapy

Scrapy入门到放弃01:我为什么选择Scrapy

时间:2022-12-07 16:01:23浏览次数:40  
标签:01 入门 url 程序 爬虫 爬取 Scrapy 加载

前言

Scrapy is coming!!

在写了七篇爬虫基础文章之后,终于写到心心念念的Scrapy了。Scrapy开启了爬虫2.0的时代,让爬虫以一种崭新的形式呈现在开发者面前。

在18年实习的时候开始接触Scrapy,花了一个月的时间,理论结合实践学习了Scrapy。本篇文章不写代码操作,只讲前因后果及理论,愿你懂得Scrapy。

原生爬虫面临问题

无论使用Java的Jsoup也好,python的requests也罢,开发爬虫都会面临下面几个问题:

1.分布式

爬虫程序一般只运行在一台主机上,如果是一模一样的爬虫程序部署在不同的主机上,那都是独立爬虫程序。如果想要弄一个分布式的爬虫,通常的思路是将爬虫程序分为url采集和数据采集两个部分。

现将url爬取下来放入到数据库中,然后通过where条件限制,或者直接使用redis的list结构,让不同主机上的爬虫程序读取到不同的url,然后进行数据爬取。

2.url去重

爬取数据的时候会经常遇到重复的url,如果重复爬取是不是浪费时间。通过url去重的思路就是:将爬取的url放入到集合中,每次爬取都去判断url是否存在于集合中。那么,如果程序中途停止了,这个内存中集合也将不复存在,再次启动程序,将无法判断哪些是已经爬取过的。

那么就用数据库,将已经爬取过的url插入到数据库中,这样就算重启程序,爬取过的url也不会丢失了。可是如果我就是想重新开始爬取,是不是还得手动清空数据库中的url表。每次查询数据库耗费的时间,这都是需要考虑的。

3.断点续爬

假如有1000个页面需要爬取,爬到第999个页面,进度条马上满格的时候,程序咯噔一下挂了,就差一个,但是还是没爬完啊,咋整?我选择重新启动程序,那么你说我怎么样才能直接从第999个开始爬取呢?

这里先讲讲我写的第一个爬虫:爬取10+个地市的poi信息。

实习,第一次开发爬虫,也不知道有高德poi接口啥的,于是就找了个网站来爬取poi信息。当时那个网站估计还在起步阶段,服务器带宽应该不高,访问速度是真的慢,而且动不动维护停站,所以我的程序也得跟着停止。如果每次启动都重新爬取,估计几年也爬不完,于是我想了个办法。

我先将所有地市下所有区县数据的条数(网站上有)先手动录入到数据库表中,每次重新启动爬虫程序的时候,先统计结果数据表中各个区县已经爬取的条数,与总条数进行对比。如果小于的话,说明还没有爬取完,然后通过某区县已爬取条数 / 网站每页展示条数计算出我已经爬取到此区县的页数,再通过余数定位到我爬到了此页面的第几个。通过这种方法,最后无丢失爬取了163w条数据。

换种思路,将爬取的url放到表中,重启程序开始爬取url的时候,先去判断url是否存在于数据表中,如果存在就不进行爬取,这样也能实现断点续爬。也是沿用了原始的url的去重的思路。

4.动态加载

在第六篇基金篇写了一个jsonp的动态加载,算是比较简单的一种,只要找到请求接口获取数据进行处理即可。第七篇写了电视猫的eval()的js加密,这算是很复杂的一种动态加载。请求接口的参数是加密的,需要耗费大量时间来分析密密麻麻的js,来计算出这个186位的参数。

so,有没有一种方式让我既能脱离阅读分析js,还能绕过动态加载?

sure!!首先关于动态加载,可以理解为浏览器内核通过执行js在前端渲染数据。那么我们在程序中搞个浏览器内核,我们直接获取js渲染后的页面数据不就可以了么?

通常使用selenium + chrome、phantomjs、pyvirtualdisplay来处理动态加载,但是或多或少都会有性能问题。

上面说了那么多,根据一贯的套路,大家也应该知道接下来我要说什么了。

关于Scrapy

Scrapy带给我的感受就是:模块分明、结构封装、功能强大。
Scrapy

WHAT

Scrapy是一个分布式爬虫框架,我把它比作成爬虫界的Spring。reqeusts就像是servlet一样,各种功能逻辑都需要自己去实现,而Spring做了集成,底层对用户透明。

就像我们知道,Spring是在application配置文件中初始化bean,在mapper中定义数据库操作一样,而使用者无需关心Spring是如何读取这些配置文件进行各种操作的。同样,Scrapy也提供了这样的功能配置。

所以说,Scrapy是一个爬虫框架,requests是一个爬虫模块,两者是有区别的。

WHY

我的政治老师曾经说过:没有无缘无故的爱,也没有无缘无故的恨。 根据我个人的使用体验,说一下我为什么那么推荐Scrapy。

  1. 性能:基于Twisted进行异步请求,怎一个快字了得!
  2. 配置化:通过配置文件对请求并发、延迟、重试次数等进行定义
  3. 插件丰富:提供了动态加载、断点续爬、分布式的解决方案,几行配置即开即用
  4. 命令行操作:通过命令行可以生成、启停、监控爬虫状态等
  5. Web界面操作:集成了Web界面来启停、监控爬虫
  6. 提供测试环境:提供了shell交互测试环境

HOW

Scrapy又是框架、功能还那么强大,是不是很难学会啊。

这种担忧大可不必,Scrapy的安装和普通python模块的安装一样,只要了解其中四个模块的作用,入门极其简单。而Scrapy爬虫程序的开发逻辑,代码更少、层次更分明,比requests要简单很多。

应用场景

Scrapy作为一个框架,有人觉得scrapy太重量级了,不如requests用起来轻便。在这里只能说,应用场景和侧重点不一样

Scrapy的开发更像是一个工程项目开发。通常用来做多数据源的爬虫数据整合,例如整合视频、小说、音乐、漫画等信息数据到一个数据表中。开发者只需事先约定好的数据字段,即可进行多人协作开发,因为scrapy通过yield关键字即可将数据放到数据库,无需再去显式地调用任何方法。

而requests更适合无需进行统一管理、无需分布式部署的单个爬虫程序的开发。

结语

其实,第一篇应该写Scrapy的架构与安装,但是我觉得用一个技术前,了解这个技术的功能和应用场景还是很有必要的,所以写了这一篇理论知识。

这篇文章写了两遍,第一遍写完了之后,不知道什么原因,在编辑器里被覆盖了,所以只能再重新写一遍。辛亏中间部分截图发给过朋友,还能少写一部分。我也终于明白了曾经网上流传的一种心情:作业写完被狗撕了,不想再写一遍。

希望本篇文章能让你对爬虫的理论知识有更深层次的了解,期待下一次相遇。

标签:01,入门,url,程序,爬虫,爬取,Scrapy,加载
From: https://www.cnblogs.com/xieqisheng666/p/16963336.html

相关文章

  • Kotlin学习快速入门(11)—— 枚举类的使用
    原文地址:Kotlin学习快速入门(11)——枚举类的使用-Stars-One的杂货小窝由于有时候偶尔用到枚举类,所以简单记录一下,和Java的一起对比记录下面以一个简单的四季设计一个枚......
  • flask入门
    1.helloword示例fromflaskimportFlaskapp=Flask(__name__)@app.route('/')defhello_world():return'HelloWorld!'if__name__=='__main__':......
  • 大数据杂谈:我和大数据(2017 - 2021)
    前言又是一年乍暖还寒,春天的风迎面而来,凉意中夹杂着些许温暖。哦,你知道,是春天来了。就像那年的实习期,在挥手告别的毕业季,定格在了那年的七月。人会怀念,怀念青涩时期的自......
  • Spring5框架概述、入门案例
    最核心的莫过于IOC和Aop。也是面试经常问到的地方、面试中几乎必定会问到spring模块1、Spring5框架概述1、Spring是==轻量级==的开源的JavaEE框架2、Spring可......
  • 如何在Windows Server 2016上重置用户“管理员”的密码
    方法来自如何在WindowsServer2016上重置用户“管理员”的密码-AleAdmin.it如果您忘记了装有WindowsServer2016(物理或虚拟)的服务器上的本地管理员密码,则可以从操作......
  • Java—Google guava工具类(高效)快速入门指南
    Java—Googleguava工具类(高效)快速入门指南Googleguava工具类特点Guava是对JavaAPI的补充,对Java开发中常用功能进行更优雅的实现,使得编码更加轻松,代码容易理解。Guava......
  • SBT30100VFCT-ASEMI低压降肖特基SBT30100VFCT
    编辑:llSBT30100VFCT-ASEMI低压降肖特基SBT30100VFCT型号:SBT30100VFCT品牌:ASEMI封装:TO-220F正向电流:30A反向电压:100V引线数量:3芯片个数:2芯片尺寸:94MIL漏电流:20ua......
  • javaScript_01_按照key排序
     javaScript_01_按照key排序前言Object.keys()与Objetc.values()实现按key排序前言最近做一个小程序项目需要用到腾讯地图的api,在计算sig的时候需要将参数按照......
  • JavaScript入门⑦-DOM操作大全
    JavaScript入门系列目录JavaScript入门①-基础知识筑基JavaScript入门②-函数(1)基础{浅出}JavaScript入门③-函数(2)原理{深入}执行上下文JavaScript入门④-万物皆......
  • ReactNative入门 —— 动画篇(上)
    ReactNative入门——动画篇(上) 在不使用任何RN动画相关API的时候,我们会想到一种非常粗暴的方式来实现我们希望的动画效果——通过修改state来不断得改变视图上的样式......