Python爬虫フレームワークScrapyチュートリアル(1)-スタート

3316 ワード

最近の実験室のプロジェクトでは、Webサイトで公開されているいくつかの記事メタデータ(タイトル、時間、本文など)を登る必要があるというニーズがあります.問題は、これらのサイトが古く、小衆であることです.もちろん、Microdataのような基準を守ることはできません.この場合、すべてのWebページがデフォルトのルールを共有しても、情報を正しくキャプチャすることは保証されません.各Webページにspiderコードを書くのも現実的ではありません.
この時、私は1つのフレームワークがspiderコードを1部書くことと複数のサイトの爬取ルールを維持することで、これらのサイトの情報を自動的につかむことができることを切に望んでいます.Scrapyがこれをすることができて嬉しいです.国内外のこの方面に関する資料が少なすぎることを考慮して、私はこの間の経験とコードを本文に分かち合いました.
このことをはっきり言うために、私は3つの文章に分けて述べました.
  • プログラミング方式でScrapy spiderを実行
  • Scrapyを使用して動的に配置可能な爬虫類をカスタマイズ
  • RedisとSQLAlchemyでScrapy Itemをデポジットして記憶する
  • この記事では、プログラムを使用してScrapy爬虫類を実行する方法について説明します.
    この文書を始める前に、Items、Spider、Pipline、Selectorの概念を知っておく必要があります.Scrapy初心者であれば、ScrapyでWebサイトを検索する方法を知りたい場合は、まず公式のチュートリアルを見ることをお勧めします.
    Scrapy爬虫類を1つ実行するには、コマンドライン(scrapy runspider myspider.py)で起動するか、コアAPIを使用してプログラミングで起動することができます.より高いカスタマイズ性と柔軟性を得るために、主に後者の方法を使用します.
    公式チュートリアルのDmozの例を使用して、プログラミング方式を使用してspiderを起動することを理解します.私たちのspiderファイルdmoz_spider.py長いこの様子:
    import scrapy
    
    class DmozItem(scrapy.Item):
        title = scrapy.Field()
        link = scrapy.Field()
        desc = scrapy.Field()
    
    class DmozSpider(scrapy.Spider):
        name = "dmoz"
        allowed_domains = ["dmoz.org"]
        start_urls = [
            "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
            "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
        ]
    
        def parse(self, response):
            for sel in response.xpath('//ul/li'):
                item = DmozItem()
                item['title'] = sel.xpath('a/text()').extract()
                item['link'] = sel.xpath('a/@href').extract()
                item['desc'] = sel.xpath('text()').extract()
                yield item

    次に、DmozSpiderを実行するためにスクリプトrun.pyを書く必要があります.
    from dmoz_spider import DmozSpider
    
    # scrapy api
    from scrapy import signals, log
    from twisted.internet import reactor
    from scrapy.crawler import Crawler
    from scrapy.settings import Settings
    
    def spider_closing(spider):
        """Activates on spider closed signal"""
        log.msg("Closing reactor", level=log.INFO)
        reactor.stop()
    
    log.start(loglevel=log.DEBUG)
    settings = Settings()
    
    # crawl responsibly
    settings.set("USER_AGENT", "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36")
    crawler = Crawler(settings)
    
    # stop reactor when spider closes
    crawler.signals.connect(spider_closing, signal=signals.spider_closed)
    
    crawler.configure()
    crawler.crawl(DmozSpider())
    crawler.start()
    reactor.run()

    そして運転python run.py私たちの爬虫類を起動しましたが、ここでは這い降りた結果の記憶操作が一切行われていないため、結果は見えません.item piplineを書いてデータベースにデータを格納し、settings.setインタフェースを使用してこのpiplineをITEMS_PIPLINEに構成することができます.この部分を3番目の記事で具体的に説明します.次のブログでは、複数のサイトの抽出ルールを維持することで、各サイトのデータをキャプチャする方法について説明します.
    GitHubでこの文書の完全な項目を見ることができます.
    注意:本明細書で使用するScrapyバージョンは0.24で、GitHubのmasterブランチはScrapy 1.0をサポートしています.
    このシリーズの3つの文章
  • Python爬虫フレームScrapyチュートリアル(1)——入門
  • Python爬虫フレームScrapyチュートリアル(2)—動的構成可能
  • Python爬虫類フレームワークScrapyチュートリアル(3)—RedisとSQLAlchemyを使用してScrapy Itemを再利用して保存
  • 参考資料
  • Running scrapy spider programmatically