我找到了这部电影“烂番茄”的第一页“所有观众”的评论:https://www.rottentomatoes.com/m/ghostbusters/reviews?type=user。
我现在的问题是,与“所有评论家”的评论加载更多的评论不同,在“所有观众”中,你点击“下一步”,而不是点击“下一页”,这会添加到URL page=2中。现在我不能这样做了,我需要弄清楚如何点击“下一步”并获得新的链接。
我想知道我是否需要使用selenium并制作一个web驱动程序来完成这个任务。
我刚开始使用开发人员工具,很难找到正确的名称来引用“下一步”按钮。下面是我的代码,成功地拉出第一页(但不是以下连续的页面所需的)和网站的开发人员端的屏幕截图作为参考。如有任何见解或建议,我们将不胜感激:
import scrapy
class ReviewsSpider(scrapy.Spider):
name = 'reviews'
allowed_domains = ['rottentomatoes.com']
start_urls = ['https://www.rottentomatoes.com/m/ghostbusters/reviews/?type=user']
def parse(self, response):
#Extracting the content using css selectors
reviews = response.css('.audience-reviews__review::text').extract()
#Give the extracted content row wise
for item in zip(reviews):
#create a dictionary to store the scraped info
scraped_info = {
'review' : item[0],
}
#yield or give the scraped info to scrapy
yield scraped_info
next_page_url = response.xpath('//li[//*[@id="content"]/div/div/nav[3]/button[2]/span]/a/@href').extract_first()
if next_page_url:
yield scrapy.Request(next_page_url, callback=self.parse)Developer Tool End Screenshot #1 Developer Tool End Screenshot #2
发布于 2021-02-03 04:33:01
这里的主要内容是我们在按下“下一步”按钮后提出的一个请求。我们应该用SiteID、endCursor和startCursor来更新它(我们也可以更新方向)。

所有必要的参数,我们可以在网页的源代码中找到。"root.RottenTomatoes.context.movieReview“下

我们可以使用regex抓取代码,并创建一个python字典来轻松获取所有参数。
regex = r'root\.RottenTomatoes\.context\.movieReview = (.*?);'
movie_review_data = re.findall(regex, tomatoes_scripts)[0]
movie_review_data_dict = json.loads(movie_review_data)然后我们获取SiteID、endCursor和endCursor
movie_id = movie_review_data_dict.get('movieId')
next_page = movie_review_data_dict.get('pageInfo').get('hasNextPage')
end_cursor = movie_review_data_dict.get('pageInfo').get('endCursor')我们可以从页面中获取第一条评论,并使用我们使用参数构建的特殊URL发出下一个请求。响应是一个JSON对象,我们将其作为Python字典(并包含用于下一页的更新参数)。

之后,我们循环我们的方法,并从字典中获取所有必要的字段。我已经提供了完整的代码,但建议它工作,但这是一个草案,当然,我们必须使用最好的剪贴画实践,如项目,ItemLoaders,为generate_review_url函数创建一个单独的文件,等等。代码是即时编写的,并显示了主要思想和工作原理
import scrapy
import re
import json
def generate_review_url(movie_id,
end_cursor,
start_cursor=''):
return f'https://www.rottentomatoes.com/napi/movie/{movie_id}'\
f'/reviews/user?direction=next&'\
f'endCursor={end_cursor}&startCursor={start_cursor}'
class ReviewsSpider(scrapy.Spider):
name = 'reviews'
allowed_domains = ['rottentomatoes.com']
start_urls = [
'https://www.rottentomatoes.com/m/ghostbusters/reviews?type=user'
]
def parse(self, response):
tomatoes_scripts = response.xpath(
'//script[contains(text(), "function (root)")]/text()'
).get()
regex = r'root\.RottenTomatoes\.context\.movieReview = (.*?);'
movie_review_data = re.findall(regex, tomatoes_scripts)[0]
movie_review_data_dict = json.loads(movie_review_data)
movie_id = movie_review_data_dict.get('movieId')
next_page = movie_review_data_dict.get('pageInfo').get('hasNextPage')
end_cursor = movie_review_data_dict.get('pageInfo').get('endCursor')
reviews = response.xpath('//ul[@class="audience-reviews"]/li')
for review in reviews:
yield {
'review': review.xpath(
'.//p[contains(@class, "audience-reviews__review")]/text()'
).get()
}
if next_page:
yield scrapy.Request(
url=generate_review_url(movie_id, end_cursor),
callback=self.parse_special_response,
meta={'movie_id': movie_id}
)
def parse_special_response(self, response):
response_dict = json.loads(response.body)
reviews = response_dict.get('reviews')
for review in reviews:
yield {
'review': review.get('review')
}
movie_id = response.meta.get('movie_id')
next_page = response_dict.get('pageInfo').get('hasNextPage')
end_cursor = response_dict.get('pageInfo').get('endCursor')
start_cursor = response_dict.get('pageInfo').get('startCursor')
if next_page:
yield scrapy.Request(
url=generate_review_url(movie_id, end_cursor, start_cursor),
callback=self.parse_special_response,
meta={'movie_id': movie_id}
)对我来说,使用regEx的解决方案看起来有点“脏”,而且没有任何异常控制等。
看起来在用户评论中有来自用户的250k+评论。当我收集了11000条评论时,我停止了脚本。我也测试了这部电影https://www.rottentomatoes.com/m/pg_psycho_goreman/reviews?type=user,收集了46条评论,它们都是相关的=)
https://stackoverflow.com/questions/66014309
复制相似问题