Logo of Scrapy.

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

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

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

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

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

Products from Amazon.com

    介绍

    在本教程中,我们将仅使用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写你自己的蜘蛛相当容易。您可以在一个对象中指定您所期望的数据,您也能够指定您蜘蛛的行为。如果您有问题,请在评论区提问。

    Kevin Jacobs

    Kevin Jacobs is a certified Data Scientist and blog writer for Data Blogger. He is passionate about any project that involves large amounts of data and statistical data analysis. Kevin can be reached using Twitter (@kmjjacobs), LinkedIn or via e-mail: kevin8080nl@gmail.com. Want to write for us? Then please check out Meta Blogger!