我被分配使用python和scrapy创建特定酒店的评论的抓取工具。我读了很多教程和指南,但是我的代码仍然不断生成一个空的CSV文件。
Item.py
import scrapy
class AgodaItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
StarRating = scrapy.Field()
Title = scrapy.Field()
Comments = scrapy.Field()
Agoda_reviews.py
import scrapy
class AgodaReviewsSpider(scrapy.Spider):
name = 'agoda_reviews'
allowed_domains = ['agoda.com']
start_urls = ['https://www.agoda.com/holiday-inn-express-kuala-lumpur-city-centre/hotel/kuala-lumpur-my.html?checkIn=2020-04-14&los=1&adults=2&rooms=1&searchrequestid=41af11cc-eaa6-42cc-874d-383761d3523c&travellerType=1&tspTypes=9']
def parse(self, response):
StarRating=response.xpath('//span[@class="Review-comment-leftScore"]/span/text()').extract()
Title=response.xpath('//span[@class="Review-comment-bodyTitle"]/span/text()').extract()
Comments=response.xpath('//span[@class="Review-comment-bodyText"]/span/text()').extract()
count = 0
for item in zip(StarRating, Title, Comments):
# create a dictionary to store the scraped info
scraped_data = {
'StarRating': item[0],
'Title': item[1],
'Comments': item[2],
}
# yield or give the scraped info to scrapy
yield scraped_data
有人可以请让我知道问题出在哪里吗?我完全一无所知...
答案 0 :(得分:0)
您的结果为空,因为scrapy收到的响应内容不多。您可以通过从终端启动抓取外壳程序并将请求发送到您要爬网的页面来查看。
scrapy shell 'https://www.agoda.com/holiday-
inn-express-kuala-lumpur-city-centre/hotel/kuala-lumpur-my.html?checkIn=2020-04-14&los=1&adults=2&rooms=1&searchrequestid=41af11cc
-eaa6-42cc-874d-383761d3523c&travellerType=1&tspTypes=9'
然后您可以通过运行以下命令查看scrapy收到的响应:
view(response)
那应该打开由scrapy接收并存储在浏览器中的响应。如您所见,没有要提取的评论。
此外,当您尝试从跨度元素中提取一些信息时,可以运行response.css('span').extract()
,您会看到响应中有一些跨度元素,但是它们中没有一个具有任何内容的类与评论有关。
总而言之,agoda给您的答复很空。结果,scrapy正在提取空列表。可能的原因是:Agoda发现您正在尝试(例如,基于您的用户代理)对他们的网站进行爬网,因此正在向您隐藏内容-或者他们正在使用JavaScript生成内容。
要解决您的问题,您应该使用agoda api,让自己熟悉用户代理的欺骗行为,或者检查出硒包,这可能有助于使用大量javascript的网站。