Scrapy笔记01- 入门篇

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

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

安装scrapy

我的测试环境是centos6.5

升级python到最新版的2.7,下面的所有步骤都切换到root用户

由于scrapy目前只能运行在python2上,所以先更新centos上面的python到最新的Python 2.7.11,具体办法请google下很多这样的教程。

先安装一些依附软件

1
2
3
yum install python-devel
yum install libffi-devel
yum install openssl-devel

然后安装pyopenssl库

1
pip install pyopenssl

安装xlml

1
2
3
yum install python-lxml
yum install libxml2-devel
yum install libxslt-devel

安装service-identity

1
pip install service-identity

安装twisted

1
pip install scrapy

安装scrapy

1
pip install scrapy -U

测试scrapy

1
scrapy bench

终究胜利,太不容易了!

简略示例

创立一个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,
}

运行:

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

成果相似下面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[{
"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的一个利益是所有要求都是被调度并异步处置,就算某个要求出错也不影响其他要求持续被处置。

我们的示例中将解析成果生成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解析器等等。