Python爬虫学习笔记 2-1:Scrapy框架

Published On 2019/11/17 Sunday, Singapore

前面章节主要用到Requests的方式爬取网页。在小规模爬虫时,Requests能够有效地满足需求,但大规模多线程的爬虫时则需要使用Scrapy。本节讲解Scrapy爬虫的基本框架, 安装和基本使用。

本文为Datacatsle Python爬虫(入门+进阶)课程学习笔记。


什么是Scrapy框架?

Scrapy是一个为了爬取网页信息并提取结构性数据而编写的应用框架。也可以应用在获取API所返回的数据(例如Amazon Associates Web Services)。Scrapy因其抓取和解析的速度而广受欢迎。多线程下载器和异步调度处理使其爬取速度非常快。另外它还具有内置的logging,exception,shell等。具体来说,Scrapy包含以下组件:



Scrapy的安装

在cmd/terminal中,输入以下命令安装scrapy

pip install scrapy 

在window下如果你使用Anaconda,也可以打开Anaconda prompt:

conda install scrapy 

在windows下,可能遇到依赖包无法安装的问题。这时候可以进入非官方安装包下载依赖包对应版本的.whl文件,使用pip install 文件地址+文件名的方式进行安装。



Scrapy的基本使用

一个基本的爬虫只需要两部分组成:爬虫(Spider)和 管道(Pipeline)。爬虫定义了如何爬取网站,包括了爬取的操作以及如何从网页的内容中提取结构化数据。管道是一个实现简单方法的类。他们接收一个项目并对其执行操作,还决定该项目是否应该继续通过流水线或被丢弃并且不再被处理。项目管道的典型用途是:

现在,我们以爬去58同城为例来看看scrapy的基本使用。



第一步,新建Scrapy项目

通过cmd/terminal运行以下命令新建一个scrapy项目,名为city_58

scrapy startproject city_58

运行结果如下:


打开/User/joye/city58查看scrapy项目文件。其包含一个city_58的子文件夹和一个名为scrapy.cfg的项目配置文件。city_58子文件夹为该项目的python模块,之后我们将在此加入代码。

city_58子文件夹下面包含:



第二步,生成爬虫文件

在cmd/terminal下运行以下命令,切换到city_58文件下。并生产在spider文件夹下生成spider_city_58.py.

cd city_58
scrapy genspider spider_city_58 58.com

spider_city_58.py是一个基于我们输入的爬虫名“spider_city_58”和爬取网站“58.com”,从scrapy包中basic模版中生成的py文件。代码如下:

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

class SpiderCity58Spider(scrapy.Spider):
    name = 'spider_city_58'    #必不可少的属性,需要利用它去决定启动哪个爬虫
    allowed_domains = ['58.com']   
    start_urls = ['http://58.com/']   #从start_urls中启动链接 

    #默认解析器方法
    def parse(self, response):
        pass



第三步,启动Scrapy框架

两种启动方法:

现在我们启动爬虫进行测试。为了知道请求到达了默认解析器(parse),在spider_city_58.py的解析部分打印 “Parse Begin” 。

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

class SpiderCity58Spider(scrapy.Spider):
    name = 'spider_city_58'    #必不可少的属性,需要利用它去决定启动哪个爬虫
    allowed_domains = ['58.com']   
    start_urls = ['http://58.com/']   #从start_urls中启动链接 

    #默认解析器方法
    def parse(self, response):
        print('Parse Begin')
        html = response.body  # response是获取到的来自网站的返回
        # 以下四行将html存入文件
        filename = "58city.html"
        file = open(filename, "w")
        file.write(html)
        file.close()





💚 Back to Home