質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1407閲覧

不特定多数のページをクロールするReadabilityを実装する関数の実装

abokadoishii

総合スコア12

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/06/30 14:35

編集2019/07/08 05:40

前提・実現したいこと

python クローリング&スクレイピングーデータ収集・解析のための実践開発ガイドーというテキストのp223のreadabiltyを利用するSpiderの実装に詰まっています。個別ページをたどる関数(pase)と個別webページをパースする関数(pase_page)が動かない状態です。
エントリーページ内のURL取得してfor文を回したいのですがどう書いたらいいのかわかりません。
paseメソッドの一つ目のfor文ではh3タグ内にあるクラスentrylist-contents-title内のurlがあればfor文をまわすという風にしたいです。
二つ目ではof=の値が2桁である場合のみ次の20件をたどるという風にしたいです。
ご教授お願い致します。

発生している問題・エラーメッセージ

INFO: Enabled spider middlewares: ['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware', 'scrapy.spidermiddlewares.referer.RefererMiddleware', 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 'scrapy.spidermiddlewares.depth.DepthMiddleware']

python

-- coding: utf-8 --

import scrapy
from myproject.items import Page
from myproject.utils import get_content
from bs4 import BeautifulSoup

class BroadSpider(scrapy.Spider):
name = 'broad'
allowed_domains = ['b.hatena.ne.jp/entrylist']
start_urls = ['http://b.hatena.ne.jp/entrylist/']

def parse(self, response): for url in response.css('.entrylist-contents-title a::attr("herf")').extract(): yield scrapy.Request(url,callback=self.parse_page) url_more=response.css('a::attr("href")').re_first(r'.*?of=\d{2}$') if url_more: yield scrapy.Request(responce.urljoin(url_more)) def parse_page(self, response): title, content = get_content(reaponse.text) yield Page(url=responce.url, title=title , content=content) ```

試したこと

テキストのサンプルコードも動かしましたが同様に動きませんでした。サポートページにも何も書かれていなかったためわかりませんでした。
サンプルコードののfor url in response.scc('a.entry-link::attr("href")')をfor url in response.css('.entrylist-contents-title a::attr("herf")')やfor url in response.css('a.entrylist-contents-title::attr("herf")'),for url in response.css('.entrylist-contents-title a::attr("herf")')に書き換えてみたりしましたが動きませんでした。

python

1# -*- coding: utf-8 -*- 2import scrapy 3from myproject.items import Page 4from myproject.utils import get_content 5from bs4 import BeautifulSoup 6 7class BroadSpider(scrapy.Spider): 8 name = 'broad' 9 allowed_domains = ['b.hatena.ne.jp/entrylist'] 10 start_urls = ['http://b.hatena.ne.jp/entrylist/'] 11 12 def parse(self, response): 13 print('\n\nresponse:{}\n\n'.format(response)) 14 15 for url in response.css('.entrylist-contents-title a::attr("href")').extract(): 16 print('\n\nURL:{}'.format(url)) 17 yield scrapy.Request(url,callback=self.parse_page) 18 19 20 url_more=response.css('a::attr("href")').re_first(r'.*?of=\d{2}$') 21 print('\n\nurl_more:{}\n\n'.format(url_more)) 22 if url_more: 23 yield scrapy.Request(responce.urljoin(url_more)) 24 25 def parse_page(self, response): 26 print('\n\npase_page\n\n') 27 title, content = get_content(reaponse.text) 28 yield Page(url=responce.url, title=title , content=content) 29 30

に修正したところ最初のfor文は動きました。urlmoreには相変わらず何も入っていません。

補足情報(FW/ツールのバージョンなど)

python 3.7.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

書籍に問い合わせたところ解決しました。```python

from myproject.items import Page
from myproject.utils import get_content

class BroadSpider(scrapy.Spider):
name = 'broad'
start_urls = ['http://b.hatena.ne.jp/entrylist/all']

def parse(self, response): for url in response.css('.entrylist-contents-title > a::attr("href")').getall(): yield scrapy.Request(url, callback=self.parse_page) url_more = response.css('.entrylist-readmore > a::attr("href")').re_first(r'.*?page=\d{1}$') if url_more: yield response.follow(url_more) def parse_page(self, response): title, content = get_content(response.text) yield Page(url=response.url, title=title, content=content)

投稿2019/07/08 12:10

abokadoishii

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問