前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。