前提・実現したいこと
python クローリング&スクレイピングという本でScrapyの使い方を勉強しています。掲載したコードはYahoo!ニュースのトップページに表示されているトピックス一覧から個別のトピックスへのリンクをたどり、トピックスのタイトルと本文を抽出するためのものです。
このコードをscrapy crawl news -o news.csvで実行しCSVファイルを作成すると、トピックスのタイトルと本文の一覧を表形式で見ることができました。
私はこの方法を参考にして他のWEBサイトから個別ページのタイトル、本文、URLを全て抜き出しCSVファイルに保存したいと考えています。その目的を実現させるためにいくつかの方法を試したのですがうまくいきません。何がいけいないのか教えてもらえると助かります。
また、同じことをScrapy以外でするとしたらどのような方法があるでしょうか。
発生している問題・エラーメッセージ
書籍のサンプルコードを修正してCSVに保存したが、ファイルを開くとデータが入っていなかった。
該当のソースコード
python
1 2# -*- coding: utf-8 -*- 3 4# Define here the models for your scraped items 5# 6# See documentation in: 7# http://doc.scrapy.org/en/latest/topics/items.html 8 9import scrapy 10 11 12class MyprojectItem(scrapy.Item): 13 # define the fields for your item here like: 14 # name = scrapy.Field() 15 pass 16 17 18class Headline(scrapy.Item): 19 """ 20 ニュースのヘッドラインを表すItem。 21 """ 22 23 title = scrapy.Field() 24 body = scrapy.Field() 25
import scrapy from myproject.items import Headline # ItemのHeadlineクラスをインポート。 class NewsSpider(scrapy.Spider): name = "news" # Spiderの名前。 # クロール対象とするドメインのリスト。 allowed_domains = ["news.yahoo.co.jp"] # クロールを開始するURLのリスト。 start_urls = ( 'http://news.yahoo.co.jp/', ) def parse(self, response): """ トップページのトピックス一覧から個々のトピックスへのリンクを抜き出してたどる。 """ for url in response.css('ul.topics a::attr("href")').re(r'/pickup/\d+$'): yield scrapy.Request(response.urljoin(url), self.parse_topics) def parse_topics(self, response): """ トピックスのページからタイトルと本文を抜き出す。 """ item = Headline() # Headlineオブジェクトを作成。 item['title'] = response.css('.newsTitle ::text').extract_first() # タイトル item['body'] = response.css('.hbody').xpath('string()').extract_first() # 本文 yield item # Itemをyieldして、データを抽出する。
試したこと
- class Headline(scrapy.Item):内にurl= scrapy.Field()を追加。
- class NewsSpider(scrapy.Spider):内のallowed_domains = ["news.yahoo.co.jp"]とstart_urls = ('http://news.yahoo.co.jp/',)に記述したURLを取得したいサイトのURLに変更。
- def parse_topics(self, response):内のitem['title'] =rsponse.css('.newsTitle ::text').extract_first()の.newsTitleをChromeの開発ツールで調べたclass名entry-titleに変更。
- item['body'] = response.css('.hbody').xpath('string()').extract_first()の.hbodyをChromeの開発ツールで調べたclass名entry-contentに変更。
- item['body']の下にitem['URL'] = response.urlを追加。
- 保存したコードをscrapy crawl news -o news.csvで実行
補足情報(FW/ツールのバージョンなど)
特になし
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。