ハイパーリンクのページ区切りボタンがないレビューサイトにページを分けようとしています。私は、各リンクのページ数をページ付けし、ハードコーディングするロジックを書いています。しかし、私はそれがstart_requests
の特定のリンクのページ数として掻き集めた情報を使用することが可能かどうかと思っています。ここ一度ページ数を削り取った後に改ページする方法は? (Scrapy)
スパイダーコード(2つのリンクを経由ページ付けする):
class TareviewsSpider(scrapy.Spider):
name = 'tareviews'
allowed_domains = ['tripadvisor.com']
# start_urls = []
def start_requests(self):
for page in range(0,395,5):
yield self.make_requests_from_url('https://www.tripadvisor.com/Hotel_Review-g60795-d102542-Reviews-or{}-Courtyard_Philadelphia_Airport-Philadelphia_Pennsylvania.html'.format(page))
for page in range(0,1645,5):
yield self.make_requests_from_url('https://www.tripadvisor.com/Hotel_Review-g60795-d122332-Reviews-or{}-The_Ritz_Carlton_Philadelphia-Philadelphia_Pennsylvania.html'.format(page))
def parse(self, response):
for idx,review in enumerate(response.css('div.review-container')):
item = {
'num_reviews': response.css('span.reviews_header_count::text')[0].re(r'\d{0,3}\,?\d{1,3}'),
'hotel_name': response.css('h1.heading_title::text').extract_first(),
'review_title': review.css('span.noQuotes::text').extract_first(),
'review_body': review.css('p.partial_entry::text').extract_first(),
'review_date': review.xpath('//*[@class="ratingDate relativeDate"]/@title')[idx].extract(),
'num_reviews_reviewer': review.css('span.badgetext::text').extract_first(),
'reviewer_name': review.css('span.scrname::text').extract(),
'bubble_rating': review.xpath("//div[contains(@class, 'reviewItemInline')]//span[contains(@class, 'ui_bubble_rating')]/@class")[idx].re(r'(?<=ui_bubble_rating bubble_).+?(?=0)')
}
yield item
'num_reviews'
は、各リンクの最後のページ数の値です。 for loop
のstart_requests
では、395
と1645
です。
これは可能ですか?可能であればヘッドレスブラウザを避けたいと思います。ありがとう!
'parse()'では、新しいURLを指定してyield request()を使ってリストに追加することができます。 – furas
この場合の解析である 'num_reviews'は、最後のページの番号を返します。 'yield Request()'はこの文脈では動作しないと考えています。b.c総ページ数がわかると、ページネーションを実行するループが必要です。 – hackerman
ページ数を知っていれば、ループで 'yield Request(url = ...)'を使うことができます。 – furas