【发布时间】:2018-05-22 22:10:39
【问题描述】:
我正在尝试通过没有超链接分页按钮的评论网站进行分页。我已经编写了逻辑来对每个链接的页数进行分页和硬编码。但是,我想知道是否可以将我抓取的信息用作start_requests 中给定链接的页数。
此处的蜘蛛代码(带有 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()中,您可以使用yield Request()和新网址将其添加到列表中。 -
解析,在本例中为
num_reviews,返回最后一页的编号。我不认为yield Request()在这种情况下会起作用,因为一旦知道总页数,就需要一个循环来执行分页。 -
如果你知道页数,那么你可以在循环中使用
yield Request( url=...)。
标签: python web-scraping pagination scrapy