1. 创建项目:
这里面使用一个在建网站(456dev.com)作为演示
使用startproject命令来创建一个项目:
Scrapy startproject demo
切换目录:
cd demo
用genspider命令建立一个通用spider模型:
Scrapy genspider dev456 456dev.com
目录结构:
dev456.py为核心文件:
# -*- coding: utf-8 -*- import scrapy class Dev456Spider(scrapy.Spider): # name 是爬虫名称 name = 'dev456' allowed_domains = ['456dev.com'] # 这是一个建设中的网站 这里选择一个栏目作为爬取目标 start_urls = ['http://www.456dev.com/list-1.html'] def parse(self, response): titles = response.xpath("//li/a[contains(@class, 'title')]/text()").extract() urls = response.xpath("//li/a[contains(@class, 'title')]/@href").extract() for title, url in zip(titles, urls): # 这里只提取标题 和对应链接 yield { 'title': title, 'url': response.urljoin(url), }
启动爬虫:
打开cmd, 切换到demo目录,执行:
scrapy crawl dev456
可以看到如图所示的输出内容:
当然,抓取过程很快会停止,因为这只抓取了一页的数据,稍微修改下执行命令:
scrapy crawl dev456 -o result.csv
结果将会输出到一个 result.csv文件(如果想保存到json, 使用: -o result.json)
以下内容引用自Scrapy官方文档:
刚刚发生了什么? 当您运行 scrapy crawl dev456 命令时,Scrapy尝试从该文件中查找Spider的定义,并且在爬取引擎中运行它。 Scrapy首先读取定义在 start_urls 属性中的URL(在本示例中,就是456dev的一个栏目页面的URL), 创建请求, 并且将接收到的response作为参数调用默认的回调函数 parse ,来启动爬取。 在回调函数 parse 中,使用Xpath来提取链接。 接着,我们产生(yield)更多的请求. 这里,您可以注意到Scrapy的一个最主要的优势: 请求(request)是 被异步调度和处理的.这意味着, Scrapy并不需要等待一个请求(request)完成及处理,在此同时, 也发送其他请求或者做些其他事情。 这也意味着,当有些请求失败或者处理过程中出现错误时,其他的请求也能继续处理。 在允许您可以以非常快的速度进行爬取时(以容忍错误的方式同时发送多个request), Scrapy也通过 一些设置 来允许您控制其爬取的方式。 例如,您可以为两个request之间设置下载延迟, 限制单域名(domain)或单个IP的并发请求量,甚至可以 使用自动限制插件 来自动处理这些问题。 最终,从页面中爬取到的数据并产生了一个dict, Scrapy收集并按照终端(command line)的要求将这些结果写入到了CSV/ JSON文件中。
接下来,将通过完善demo项目来进一步学习Scrapy.
关键字词: