Logo of Scrapy.

如何使用 Python 和 Scrapy ,仅通过5个简单的步骤来抓取一个网站?

我们能够以固定价格为您提供抓取网站的服务!如有兴趣,请联系我

在本Python抓取教程中,您将学习如何在Scrapy框架里,用 Python 写一个简单的网站抓取器。 在本文中,Data Blogger将被当作例子。

Scrapy:一个旨在于网站中提取所需数据的开源和协作式框架。它快速、简单,然而可扩展性强。

顺便说一下,如果您对抓取推特感兴趣,不妨读一下这篇文章

介绍

在本教程中,我们将仅使用Scrapy 和 Python 3 (或 Python 2) ,设计一个网站抓取器。本教程有Python 2 和Python 3 两者的支持。有无限的可能。请小心,有一些网站抓取是不合法的!例如,虽然技术上可能,但使用Scrapy 或其他网站抓取器来抓取领英(https://www.linkedin.com/)是不允许的。然而,领英在2017年输掉了一场此类官司。

内容+链接提取器

Scrapy被用来从一个网站提取内容和链接。其完成方式是以递归方式跟踪一个给定网站的所有链接。

步骤1:安装Scrapy

按照Scrapy网站,我们只需要执行如下命令来安装Scrapy:

pip install scrapy

步骤2:设置项目

现在,我们将为您的项目创建目录结构。如下命令,是为Data Blogger 抓取器使用。您可以把datablogger_scraper 改为您自己项目的名称。

scrapy startproject datablogger_scraper

步骤3:创建一个对象

下一件事,是创建一个抓取目标网站内容的蜘蛛。蜘蛛需要知道抓取什么数据。数据可以放入一个对象。在本教程中,我们将抓取一个网站的内部链接。一个链接被定义为一个对象,有来源URL 和目的URL 。来源URL是在哪里我们可以发现链接。它也有一个目的URL ,就是当链接被点击的时候,链接可以带您浏览至何处。当来源URL 和目的URL 都在一个网站时,链接被称为内部链接。

抓取对象实施

对象在items.py被定义。本项目的items.py有如下内容:

import scrapy

class DatabloggerScraperItem(scrapy.Item):
    # 来源 URL
    url_from = scrapy.Field()
    # 目的URL
    url_to = scrapy.Field()

注意您能够定义任何您想要抓取的对象!例如,当您抓取一个关于游戏控制台的网站,您能够指定一个对象“游戏控制台”(有 “vendor”, “price” and “release date”几个属性)。如果你在抓取几个网站的关于音乐的信息,你能够定义一个对象,有像 “artist”、“ release date” 和 “genre”这样的属性。在领英上,您可以抓取一个有 “education”、“ work” 和 “age”属性的“人”。

步骤4:创建蜘蛛

现在我们把数据封装入了一个对象,可以开始创建蜘蛛了。首先,我们将浏览至项目目录。然后,我们将执行如下命令,创建蜘蛛(可以在spiders/ 目录中看到):

scrapy genspider datablogger data-blogger.com 

蜘蛛实施

现在,蜘蛛已被创建(spiders/datablogger.py)。您可以随意定制此文件。我完成时的代码如下:

# -*- 编码: utf-8 -*-
import scrapy
from scrapy.linkextractor import LinkExtractor
from scrapy.spiders import Rule, CrawlSpider
from datablogger_scraper.items import DatabloggerScraperItem


class DatabloggerSpider(CrawlSpider):
    # 蜘蛛名称
    name = "datablogger"

    # 被允许的域名(至其他域名的链接被跳过)
    allowed_domains = ["data-blogger.com"]

    #  URL开端
    start_urls = ["https://www.data-blogger.com/"]

    # 蜘蛛有一个规则:提取所有(唯一和规范化的)链接,跟踪他们,并且使用parse_items方法解析他们
    rules = [
        Rule(
            LinkExtractor(
                canonicalize=True,
                unique=True
            ),
            follow=True,
            callback="parse_items"
        )
    ]

    # 通过访问在start_urls里指定的所有URL,来启动请求的方法
    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, callback=self.parse, dont_filter=True)

    #解析细目的方法
    def parse_items(self, response):
        # 在特定页面发现的细目清单
        items = []
        # 仅提取(关于当前页面)的规范化和唯一的链接
        links = LinkExtractor(canonicalize=True, unique=True).extract_links(response)
        # 现在处理所有发现的链接
        for link in links:
            # 检查链接URL的域名是否被允许:就是它是否是被允许的域名之一
            is_allowed = False
            for allowed_domain in self.allowed_domains:
                if allowed_domain in link.url:
                    is_allowed = True
            # 如果允许,创建一个新的细目,并且把它加到已发现的细目中
            if is_allowed:
                item = DatabloggerScraperItem()
                item['url_from'] = response.url
                item['url_to'] = link.url
                items.append(item)
        # 返回所有发现的细目
        return items

有几件事值得一提。蜘蛛扩展 CrawlSpider 对象,CrawlSpider 有以递归方式抓取网站的解析方法。在代码中,一个规则将被定义。这个规则告诉蜘蛛跟踪所有它碰到的链接。这个规则也指定只有唯一的链接被解析,所有没有任何链接将被解析两次!而且,规范化属性也确保链接不被解析两次。

链接提取器

链接提取器是旨在从网页中提取链接的模块。

步骤5:执行蜘蛛

浏览至您项目的根目录。然后执行以下命令:

scrapy crawl datablogger -o links.csv -t csv

而后,这个命令在您的网站上运行,并且生成一个存放数据的CSV 文件。在我的情况里,我得到了一个有如下内容的、名为links.csv的文件:

url_from,url_to
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/cern/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,http://www.data-blogger.com/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/data-science/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/software-science/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/mathematics/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/projects/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/category/competition/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/about-me/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/contact/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/hire-me/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/author/admin/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.facebook.com/sharer/sharer.php?t=Monitoring+your+cluster+in+just+a+few+minutes+using+ISA&u=https%3A%2F%2Fwww.data-blogger.com%2F2016%2F07%2F18%2Fmonitoring-your-cluster-in-just-a-few-minutes%2F
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://twitter.com/intent/tweet?text=Monitoring+your+cluster+in+just+a+few+minutes+using+ISA&url=https%3A%2F%2Fwww.data-blogger.com%2F2016%2F07%2F18%2Fmonitoring-your-cluster-in-just-a-few-minutes%2F
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://plus.google.com/share?url=https%3A%2F%2Fwww.data-blogger.com%2F2016%2F07%2F18%2Fmonitoring-your-cluster-in-just-a-few-minutes%2F
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/tag/cluster/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/tag/isa/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/tag/monitoring/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/tag/software/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/07/17/cern-deel-3-trip-naar-zurich/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/07/19/project-euler-using-scala-problem-1/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/08/13/apache-flink-the-next-distributed-data-processing-revolution/
https://www.data-blogger.com/2016/07/18/monitoring-your-cluster-in-just-a-few-minutes/,https://www.data-blogger.com/2016/07/24/summing-the-fibonacci-sequence/
https://www.data-blogger.com/2016/07/17/why-scala/,https://www.data-blogger.com/2016/07/17/why-scala/
https://www.data-blogger.com/2016/07/17/why-scala/,https://www.data-blogger.com/
...

结论

使用Scrapy写你自己的蜘蛛相当容易。您可以在一个对象中指定您所期望的数据,您也能够指定您蜘蛛的行为。如果您有问题,请在评论区提问。