scrapy创建项目

创建项目

在目标文件夹下命令行输入:

scrapy startproject projectname

成功后打印如下:

E:\studyData\scrapy>scrapy startproject tutorial
New Scrapy project 'tutorial', using template directory 'c:\\python36\\lib\\site-packages\\scrapy\\templates\\project', created in:
    E:\studyData\scrapy\tutorial

You can start your first spider with:
    cd tutorial
    scrapy genspider example example.com

成功后,文件夹结构如下:

tutorial/
    scrapy.cfg            # 部署配置文件

    tutorial/             # 项目的Python模块, 从这里导入你的代码
        __init__.py

        items.py          # 项目的items定义文件

        middlewares.py    # 项目的middlewares(中间件)文件

        pipelines.py      # 项目的pipelines文件

        settings.py       # 项目settings(设置)文件

        spiders/          # 放你自己编写的代码的文件夹
            __init__.py

Spider是用来从一个网站(或一组网站)获取信息的自定义定义的类和Scrapy类。它们必须对scrappy.spider进行子类化,并定义初始请求,可以选择如何获取页面中的链接,以及如何解析下载的页面内容以提取数据。

下面是第一个Spider,保存为qutoes_spider.py,并保存在tutorial/spiders文件目录里。

import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

如上所示,Spider 子类 scrapy.Spider 定义了一些属性和方法:

  • name: 标识Spider。必须唯一,也就是说不同的Spider不能有相同的name。

  • start_requests(): 必须返回迭代的Requests (可以返回requests列表或者生成器函数) 。 随后的请求将从这些初始请求中依次生成。

  • parse(): 用来处理为每个请求下载的响应的方法。response参数是textResponse的一个实例,用来保存页面内容,并有进一步有用的方法来处理它。

注:parse() 方法通常解析响应,将获取的数据提取为dict,并查找要跟踪的新URL,并从中创建新请求(Request)。

运行spider 

在目标文件夹下命令行输入:

scrapy crawl quotes

这个命令运行的name为quotes的spider,它将发送一些对quotes.toscrape.com域的请求。将得到类似的输出打印:

... (omitted for brevity)
2016-12-16 21:24:05 [scrapy.core.engine] INFO: Spider opened
2016-12-16 21:24:05 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2016-12-16 21:24:05 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://quotes.toscrape.com/robots.txt> (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/1/> (referer: None)
2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/2/> (referer: None)
2016-12-16 21:24:05 [quotes] DEBUG: Saved file quotes-1.html
2016-12-16 21:24:05 [quotes] DEBUG: Saved file quotes-2.html
2016-12-16 21:24:05 [scrapy.core.engine] INFO: Closing spider (finished)
...

现在,检查当前目录中的文件。目录中新增了两个文件:quotes-1.html和quotes-2.html,其中包含了我们的parsemethod结构中的各个URL的内容。

这里发生了什么

scrappy调度scrappy.request对象,该对象由spider的start-requests方法返回。在接收到每个响应后,它实例化响应对象并调用与请求相关联的回调方法(在本例中是parse方法),将响应作为参数传递。

start_requests方法快捷方式

只需定义一个start_urls类的URL列表属性。然后,start_requests()的默认实现将使用此列表为您的spider创建初始请求:

import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/page/1/',
        'http://quotes.toscrape.com/page/2/',
    ]

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值