Scrapy项目创建的简单流程

1.进入到一个要创建Scrapy项目的文件夹,然后运行以下命令来生成默认的Scrapy项目结构。

在Linux CentOS-6.10中,运行

#scrapy startproject tutorial

然后生成的目录结构如下:

tutorial/
    scrapy.cfg
    tutorial/
        __init__.py
        items.py
        middlewares.py
        pipelines.py
        settings.py
        spiders/
            __init__.py

2.定义Item

打开items.py,把TutorialItem类改为:

class TutorialItem(scrapy.Item):  # 继承于scrapy.Item类
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()  # 标题字段
    content = scrapy.Field()  # 内容字段

3.Spider爬虫

spiders文件夹中新建TutorialSpider.py,代码如下:

# coding=utf-8

import scrapy

class TutorialSpider(scrapy.spiders.Spider):
    name = 'tutorial'  # 爬虫名称,要唯一,不同的Spider不能有相同的名称
    start_urls = ['http://www.example.com']  # 包含Spider在启动时进行爬取的URL列表,第一个被爬取的页面是列表中的其中一个,后续的URL则可从获取的数据中提取

    '''
    这是Spider的一个方法,被调用时,每个初始的URL完成下载后生成的Response对象会传递给这个方法。
    这个方法负责解析返回的Response数据、提取数据、生成进一步处理的URL的Request对象。
    '''
    def parse(self, response):
        filename = './tutorial.txt'
        with open(filename, 'wb') as f:
            f.write(response.url)  # 把URL写入文件
            f.write('\n')  # 写入换行
            f.write(response.body)  # 把响应的内容写入文件

然后在tutorial的目录下,运行

#scrapy crawl tutorial

运行完,会在此目录下生成tutorial.txt文件,运行cat tutorial.txt,得到的输出为:

http://www.example.com
<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;

    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 50px;
        background-color: #fff;
        border-radius: 1em;
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        body {
            background-color: #fff;
        }
        div {
            width: auto;
            margin: 0 auto;
            border-radius: 0;
            padding: 1em;
        }
    }
    </style>
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.</p>
    <p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>

4.提取Item

Scrapy使用基于XPath和CSS表达式机制的选择器(Selector)来提取数据。

TutorialSipder.py中,添加另一个Spider的子类,代码如下:

class TutorialSpider2(scrapy.spiders.Spider):
    name = 'tutorial2'  # 爬虫名称,要唯一,不同的Spider不能有相同的名称
    start_urls = ['http://www.example.com']  # 包含Spider在启动时进行爬取的URL列表,第一个被爬取的页面是列表中的其中一个,后续的URL则可从获取的数据中提取

    '''
    这是Spider的一个方法,被调用时,每个初始的URL完成下载后生成的Response对象会传递给这个方法。
    这个方法负责解析返回的Response数据、提取数据、生成进一步处理的URL的Request对象。
    '''

    def parse(self, response):
        filename = './tutorial2.txt'
        f = open(filename, 'wb')  # 打开文件
        title = response.xpath('//div/h1/text()').extract_first()  # 获取h1里的文本
        f.write(title)  # h1文本写入文件
        f.write('\n')  # 写入换行
        content = response.xpath('//div/p')[0].xpath('text()').get()  # 获取第一个p里的文本
        f.write(content)  # 第一个p里的文本写入文件
        f.write('\n')  # 写入换行
        f.close()  # 关闭文件

然后在tutorial的目录下,运行

#scrapy crawl tutorial2

运行完,会在此目录下生成tutorial2.txt文件,运行cat tutorial2.txt,得到的输出为:

Example Domain
This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.

接下来使用TutorialItem这个类。在TutorialSipder.py中,再添加一个Spider的子类,代码如下:

from tutorial.items import TutorialItem  # 导入TutorialItem

class TutorialSpider3(scrapy.spiders.Spider):
    name = 'tutorial3'  # 爬虫名称,要唯一,不同的Spider不能有相同的名称
    start_urls = ['http://www.example.com']  # 包含Spider在启动时进行爬取的URL列表,第一个被爬取的页面是列表中的其中一个,后续的URL则可从获取的数据中提取

    '''
    这是Spider的一个方法,被调用时,每个初始的URL完成下载后生成的Response对象会传递给这个方法。
    这个方法负责解析返回的Response数据、提取数据、生成进一步处理的URL的Request对象。
    '''

    def parse(self, response):
        title = response.xpath('//div/h1/text()').extract_first()  # 获取h1里的文本
        content = response.xpath('//div/p')[0].xpath('text()').get()  # 获取第一个p里的文本
        item = TutorialItem()
        item['title'] = title
        item['content'] = content
        yield item

然后在tutorial的目录下,运行

#scrapy crawl tutorial3

可以在终端看到运行信息。

5.保存数据

为了保存数据,可以在pipelines.py里编写item的管道,可以把item保存到数据库、文件等。这里不用管道,直接在运行时指定输出到一个JSON文件。

然后在tutorial的目录下,运行

#scrapy crawl tutorial3 -o tutorial3.json

运行完,会在此目录下生成tutorial3.json文件,运行cat tutorial3.json,得到的输出为:

[
{"content": "This domain is established to be used for illustrative examples in documents. You may use this\n    domain in examples without prior coordination or asking for permission.", "title": "Example Domain"}
]

源码可于github下载:https://github.com/gkimeeq/WebCrawler

posted @ 2019-07-22 13:26  gkimeeq  阅读(446)  评论(0编辑  收藏  举报