前提・実現したいこと
scrapyを用いてmongoDBにブログページのクロール結果を保存したい
発生している問題・エラーメッセージ
2018-12-05 13:40:31 [scrapy.utils.signal] ERROR: Error caught on signal handler: <bound method FeedExporter.item_scraped of <scrapy.extensions.feedexport.FeedExporter object at 0x109716eb8>> Traceback (most recent call last): File "/Users/aaaa/scrapingfiles/scraping/lib/python3.7/site-packages/twisted/internet/defer.py", line 151, in maybeDeferred result = f(*args, **kw) File "/Users/aaaa/scrapingfiles/scraping/lib/python3.7/site-packages/pydispatch/robustapply.py", line 55, in robustApply return receiver(*arguments, **named) File "/Users/aaaa/scrapingfiles/scraping/lib/python3.7/site-packages/scrapy/extensions/feedexport.py", line 224, in item_scraped slot.exporter.export_item(item) File "/Users/aaaa/scrapingfiles/scraping/lib/python3.7/site-packages/scrapy/exporters.py", line 93, in export_item data = self.encoder.encode(itemdict) + '\n' File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/encoder.py", line 199, in encode chunks = self.iterencode(o, _one_shot=True) File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/encoder.py", line 257, in iterencode return _iterencode(o, 0) File "/Users/aaaa/scrapingfiles/scraping/lib/python3.7/site-packages/scrapy/utils/serialize.py", line 36, in default return super(ScrapyJSONEncoder, self).default(o) File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/json/encoder.py", line 179, in default raise TypeError(f'Object of type {o.__class__.__name__} ' TypeError: Object of type ObjectId is not JSON serializable 2018-12-05 13:40:31 [scrapy.core.engine] INFO: Closing spider (finished)
該当のソースコード
python
1import scrapy 2 3from myproject.items import Page 4from myproject.utils import get_content 5 6 7class BroadSpider(scrapy.Spider): 8 name = "broad" 9 start_urls = ( 10 # はてなブックマークの新着エントリーページ。 11 'http://b.hatena.ne.jp/entrylist', 12 ) 13 14 def parse(self, response): 15 """ 16 はてなブックマークの新着エントリーページをパースする。 17 """ 18 19 # 個別のWebページへのリンクをたどる。 20 for url in response.css('a.js-keyboard-openable::attr("href")').extract(): 21 # parse_page() メソッドをコールバック関数として指定する。 22 yield scrapy.Request(url, callback=self.parse_page) 23 24 # of=の値が2桁である間のみ「次の20件」のリンクをたどる(最大5ページ目まで)。 25 next_page = response.css('a.js-keyboard-openable::attr(href)').extract_first() 26 if next_page is not None: 27 next_page = response.urljoin(next_page) 28 yield scrapy.Request(next_page, callback=self.parse) 29 30 def parse_page(self, response): 31 """ 32 個別のWebページをパースする。 33 """ 34 35 # utils.pyに定義したget_content()関数でタイトルと本文を抽出する。 36 title, content = get_content(response.text) 37 # Pageオブジェクトを作成してyieldする。 38 yield Page(url=response.url, title=title, content=content) 39
試したこと
見たことがないエラーであったためどこがだめなのか何も分かっていない状態です。
わかる方いましたら是非回答の方よろしくお願いいたします。
情報不足等ありましたら随時追加いたしますのでよろしくお願いいたします。
あなたの回答
tips
プレビュー