【零基础学爬虫】scrapy框架的基本使用

回顾

scrapy是一个非常强大的异步爬虫框架,组件丰富,我们只需要关注爬虫的逻辑即可。本文通过一个scrapy项目实战,来熟悉scrapy的使用

站点分析

目标站点:scrapy官方提供的抓取网站,主要是名人名言、作者标签之类的信息
【零基础学爬虫】scrapy框架的基本使用
网页结构非常简单
【零基础学爬虫】scrapy框架的基本使用
翻页url:
http://quotes.toscrape.com/page/5/
该网站没有任何的反爬虫措施,结果也很简单

流程框架

【零基础学爬虫】scrapy框架的基本使用

实现

进入命令行,切换到工程文件夹执行:

  • scrapy startproject quote_tutorial
  • cd quote_tutorial
  • scrapy genspider quotes quotes.toscrape.com
  • 打开pycharm,会发现如下图界面
    【零基础学爬虫】scrapy框架的基本使用

其中一个文件的内容如下:
【零基础学爬虫】scrapy框架的基本使用
name:是唯一的标识
parse:用来解析爬取到的页面
其余文件介绍:
1.配置文件
【零基础学爬虫】scrapy框架的基本使用
2.items文件
它其实是用来保存数据的一个数据结构
【零基础学爬虫】scrapy框架的基本使用
3.middlewares文件
它其实是爬取数据时定义的一些中间件,可以用来处理request、response和一些exceptions之类的操作,可以用它来改一些request、response等一些相关的配置
4.piplines文件
管道,用来输出一些items,主要用做数据清洗、重复的检查、将数据存储到数据库
【零基础学爬虫】scrapy框架的基本使用
5.settings
这个文件比较重要,里面对了很多配置信息。、实际上就是很多的变量
【零基础学爬虫】scrapy框架的基本使用

最主要的代码都会在spider目录下写

运行

【零基础学爬虫】scrapy框架的基本使用
上图中的quotes是spider的唯一标识符,在之前也有介绍
运行:scrapy crawl quotes 就是执行那么为quotes的spider
下图是截取的另外一部分输出:
【零基础学爬虫】scrapy框架的基本使用
另外,我们该写下parse方法,该方法会在发起http请求后调用,主要是用来解析页面:
【零基础学爬虫】scrapy框架的基本使用
像之前一样运行:scrapy crawl quotes 后控制台就会输出请求成功后的网页源码
parse方法其实回调,在spider调用执行的时候首先会调用上图中的start_urls请求链接,然后会自动调用parse方法解析网页

网页分析和实现

我们需要的数据有:

  • 名言内容
  • 作者
  • 标签
    【零基础学爬虫】scrapy框架的基本使用
    先前提过,scrapy中自动生成了很多文件其中有一个名字为item,这个文件是用来定义存储网页数据的数据结构。这个类需要按照需求重写:主要是指定一些字段,之后就可以把爬取后的数据按照一个一个的整体保存下来了。item文件的初始化内容如下图所示:
    【零基础学爬虫】scrapy框架的基本使用
    上图中注释的name字段其实就是示例说明,针对本次爬虫的需求我们对该文件进行补充,最后如下图所示:
    【零基础学爬虫】scrapy框架的基本使用
    上述就是依旧本次爬虫需求而定义的存储数据的数据结构

页面解析
数据结构定义好之后,我们需要进行页面解析也就是parse方法的编写:
【零基础学爬虫】scrapy框架的基本使用
本文的parse方法如下图所示:
【零基础学爬虫】scrapy框架的基本使用

scrapy调试
scrapy还提供了一个非常强大的根据:scrapy shell
可以从terminal输入:scrapy shell quotes.toscrape.com后面跟的是网址,之后就可以进入命令行交互模式下面,在这里进行一些调试
【零基础学爬虫】scrapy框架的基本使用
之后可以进行一些调试:
【零基础学爬虫】scrapy框架的基本使用
也可以进行一些选择器的调试:
【零基础学爬虫】scrapy框架的基本使用
【零基础学爬虫】scrapy框架的基本使用

修改parse方法后运行
在修改parse方法后再在terminal中执行:scrapy crawl quotes
运行结果图:
【零基础学爬虫】scrapy框架的基本使用

翻页解析

上面已经完成了单个页面的解析,接下来就剩翻页问题了。翻页可以通过url来请求:
http://quotes.toscrape.com/page/5/
直接改变url中的页面数字即可完成翻页的请求,这个链接可以从response中获取:
【零基础学爬虫】scrapy框架的基本使用
使用css选择器即可:
next = response.css(’.pager .next a::attr(herf)’).extract_first()
之后将next转换为绝对的url:
url = response.urljoin(next)
上面得到的就是下一页的绝对url

加上翻页功能,完整的parse函数如下图所示:
【零基础学爬虫】scrapy框架的基本使用
完成parse函数后,再次执行:
scrapy crawl quotes
结果如下:
【零基础学爬虫】scrapy框架的基本使用

如何保存结果呢?

scrapy crawl quotes -o quotes.json
在当前目录下会生成quotes.json文件,文件中就是爬取的数据:
【零基础学爬虫】scrapy框架的基本使用
或者

  • scrapy crawl quotes -o quotes.json:可以使用json.loads解析
  • scrapy crawl quotes -o quotes.csv
  • *scrapy crawl quotes -o quotes.txt
  • *scrapy crawl quotes -o quotes.xml
  • *scrapy crawl quotes -o quotes.jl:其实是json line格式:一行一行的存储
  • 使用 -o输出结果到文件,通过文件名称后缀自动判断文件格式
  • 另外还支持:pickle、marshal等后缀的文件格式
  • 还支持远程保存:-o ftp://user:[email protected]/path/quotes.csv

剩余工作

保存之前可以做一些其他操作,比如:过滤掉一些不合格的item数据。这个功能可以借助piplines.py文件完成。该文件的原始内容如下:
【零基础学爬虫】scrapy框架的基本使用
这里我们只显示名言的前150个字符,如果名言的长度超过了150,则在后面用**…**替换piplines.py文件最终如下图所示:
【零基础学爬虫】scrapy框架的基本使用

注意:可以定义多个pipline:比如写数据库之类的也可以使用pipline实现
pipline定义后需要在setting文件中配置,当前启用哪几个pipline
【零基础学爬虫】scrapy框架的基本使用
最后,再次执行:
scrapy crawl quotes
执行结果表明达到了预期效果:
【零基础学爬虫】scrapy框架的基本使用

项目源码

上面给出了文章的核心代码分析,

扫描下方二维码,发送关键词“scrapy”即可获取本文的完整源码和详细程序注释
【零基础学爬虫】scrapy框架的基本使用

公众号专注:互联网求职面经javapython爬虫大数据等技术、海量资料分享:公众号后台回复“csdn文库下载”即可免费领取【csdn】和【百度文库】下载服务;公众号后台回复“资料”:即可领取5T精品学习资料java面试考点java面经总结,以及几十个java、大数据项目资料很全,你想找的几乎都有