Python 之 Scrapy笔记(1)- 入门篇

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘, 信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取(更确切来说,网络抓取)所设计的, 也可以应用在获取API所返回的数据(比如Web Services)或者通用的网络爬虫。

Scrapy也能帮你实现高阶的爬虫框架,比如爬取时的网站认证、内容的分析处理、重复抓取、分布式爬取等等很复杂的事。

安装scrapy

环境: ubuntu 14.04 + python2.7

最近在学习爬虫,早就听说Python写爬虫极爽(貌似pythoner说python都爽,不过也确实,python的类库非常丰富,不用重复造轮子),还有一个强大的框架Scrapy,于是决定尝试一下。

要想使用Scrapy第一件事,当然是安装Scrapy,讲一下 Ubuntu的安装。

在安装Scrapy前需要安装一系列的依赖. 
* Python 2.7: Scrapy是Python框架,当然要先安装Python ,不过由于Scrapy暂时只支持 Python2.7,,因此首先确保你安装的是Python 2.7 
* lxml:大多数Linux发行版自带了lxml 
* OpenSSL:除了windows之外的系统都已经提供 
* Python Package: pip and setuptools. 由于现在pip依赖setuptools,所以安装pip会自动安装setuptools

有上面的依赖可知,在非windows的环境下安装 Scrapy的相关依赖是比较简单的,只用安装pip即可。Scrapy使用pip完成安装。

检查Scrapy依赖是否安装

你可能会不放心自己的电脑是否已经安装了,上面说的已经存在的依赖,那么你可以使用下面的方法检查一下,本文使用的是Ubuntu 14.04。

检查Python的版本

如果看到下面的输出,说明Python的环境已经安装,我这里显示的是Python 2.7.6,版本也是2.7的满足要求。如果没有出现下面的信息,那么请读者自行百度安装Python,本文不介绍Python的安装(网上一搜一堆)。 

检查lxml和OpenSSL是否安装

假设已经安装了Python,在控制台输入python,进入Python的交互环境。 

然后分别输入import lxml和import OpenSSL如果没有报错,说明两个依赖都已经安装。 

安装python-dev和libevent

python-dev是linux上开发python比较重要的工具,以下的情况你需要安装 
* 你需要自己安装一个源外的python类库, 而这个类库内含需要编译的调用python api的c/c++文件 
* 你自己写的一个程序编译需要链接libpythonXX.(a|so)

libevent是一个时间出发的高性能的网络库,很多框架的底层都使用了libevent

上面两个库是需要安装的,不然后面后报错。使用下面的指令安装

$sudo  apt -get  install python -dev   $sudo  apt -get  install libevent -dev  安装pip

因为Scrapy可以使用pip方便的安装,因此我们需要先安装pip,可以使用下面的指令安装pip

$ sudo apt -get  install python -pip  使用pip安装Scrapy

使用下面的指令安装Scrapy

sudo  pip install scrapy

记住一定要获得root权限!!!切记!![进入root的方法:  *****$: sudo su]

至此scrapy安装完成,使用下面的命令检查Scrapy是否安装成功

scrapy version

显示如下结果说明安装成功,此处的安装版本是1.02 

简单示例

创建一个python源文件,名为stackoverflow.py,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import scrapy


class StackOverflowSpider(scrapy.Spider):
    name = 'stackoverflow'
    start_urls = ['http://stackoverflow.com/questions?sort=votes']

    def parse(self, response):
        for href in response.css('.question-summary h3 a::attr(href)'):
            full_url = response.urljoin(href.extract())
            yield scrapy.Request(full_url, callback=self.parse_question)

    def parse_question(self, response):
        yield {
            'title': response.css('h1 a::text').extract()[0],
            'votes': response.css('.question .vote-count-post::text').extract()[0],
            'body': response.css('.question .post-text').extract()[0],
            'tags': response.css('.question .post-tag::text').extract(),
            'link': response.url,
        }

运行:

scrapy runspider stackoverflow.py -o top-stackoverflow-questions.json

结果类似下面:

[{
    "body": "... LONG HTML HERE ...",
    "link": "http://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-an-unsorted-array",
    "tags": ["java", "c++", "performance", "optimization"],
    "title": "Why is processing a sorted array faster than an unsorted array?",
    "votes": "9924"
},
{
    "body": "... LONG HTML HERE ...",
    "link": "http://stackoverflow.com/questions/1260748/how-do-i-remove-a-git-submodule",
    "tags": ["git", "git-submodules"],
    "title": "How do I remove a Git submodule?",
    "votes": "1764"
},
...]

当你运行scrapy runspider somefile.py这条语句的时候,Scrapy会去寻找源文件中定义的一个spider并且交给爬虫引擎来执行它。 start_urls属性定义了开始的URL,爬虫会通过它来构建初始的请求,返回response后再调用默认的回调方法parse并传入这个response。 我们在parse回调方法中通过使用css选择器提取每个提问页面链接的href属性值,然后yield另外一个请求, 并注册parse_question回调方法,在这个请求完成后被执行。

处理流程图:

scrapy架构图scrapy架构图

Scrapy的一个好处是所有请求都是被调度并异步处理,就算某个请求出错也不影响其他请求继续被处理。

我们的示例中将解析结果生成json格式,你还可以导出为其他格式(比如XML、CSV),或者是将其存储到FTP、Amazon S3上。 你还可以通过pipeline 将它们存储到数据库中去,这些数据保存的方式各种各样。

Scrapy特性一览

你已经可以通过Scrapy从一个网站上面爬取数据并将其解析保存下来了,但是这只是Scrapy的皮毛。 Scrapy提供了更多的特性来让你爬取更加容易和高效。比如:

  1. 内置支持扩展的CSS选择器和XPath表达式来从HTML/XML源码中选择并提取数据,还能使用正则表达式
  2. 提供交互式shell控制台试验CSS和XPath表达式,这个在调试你的蜘蛛程序时很有用
  3. 内置支持生成多种格式的订阅导出(JSON、CSV、XML)并将它们存储在多个位置(FTP、S3、本地文件系统)
  4. 健壮的编码支持和自动识别,用于处理外文、非标准和错误编码问题
  5. 可扩展,允许你使用signals 和友好的API(middlewares, extensions, 和pipelines)来编写自定义插件功能。
  6. 大量的内置扩展和中间件供使用:
    • cookies and session handling
    • HTTP features like compression, authentication, caching
    • user-agent spoofing
    • robots.txt
    • crawl depth restriction
    • and more
  7. 还有其他好多好东东,比如可重复利用蜘蛛来爬取Sitemaps和XML/CSV订阅, 一个跟爬取元素关联的媒体管道来 自动下载图片, 一个缓存DNS解析器等等。
原文链接:http://www.pycoding.com/2016/03/08/scrapy-01.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值