主页 > 编程资料 > Python >
发布时间:2018-09-26 作者:apizl 阅读:454次

1. 创建项目:

这里面使用一个在建网站(456dev.com)作为演示

使用startproject命令来创建一个项目:

Scrapy startproject demo

 

切换目录:

cd demo


genspider命令建立一个通用spider模型:

Scrapy genspider dev456 456dev.com

 

目录结构:

Scrapy 入门教程示例


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 入门教程示例

Scrapy 入门教程示例


当然,抓取过程很快会停止,因为这只抓取了一页的数据,稍微修改下执行命令:

scrapy crawl dev456 -o result.csv

结果将会输出到一个 result.csv文件(如果想保存到json, 使用: -o result.json)


Scrapy 入门教程示例



以下内容引用自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.

关键字词: