我目前正在从 Tripadvisor 网络抓取餐厅评论,并尝试从此页面检索餐厅链接。
我想要底部 30 个餐厅页面的链接,但我只用其中一个进行一些测试。可以使用以下表达式检索列表中的第一个:
//div[@data-test='1_list_item']/div/div[2]/div[1]/div//a/@href
Scrapy 有一些意外的行为,以下 css 表达式应该足以检索所有链接,但返回一个空数组:
response.css('.b::attr(href)').extract()
许多 Xpath 表达式也是如此,并使用上面的表达式,如下所示:
response.xpath("//div[@data-test='1_list_item']/div/div[2]/div[1]/div//a/@href").get()
我得到以下链接作为回报:
/ShowUserReviews-g187791-d25107357-r916086825-ADESSO_Vineria_Bistrot-Rome_Lazio.html
我不知道这是从哪里来的,我在检查 chrome 控制台中看到的链接以及我期望得到的回报是:
/餐厅_评论-g187791-d25107357-评论-ADESSO_Vineria_Bistrot-Rome_Lazio.html
您在使用Scrapy时遇到的问题可能是由于TripAdvisor网站使用JavaScript加载数据源,而Scrapy默认不支持JavaScript。因此,当您尝试使用
response.css
或 response.xpath
获取链接时,Scrapy 只能看到页面的初始状态,而不会加载已加载的数据。
要检查已加载的页面,请使用 open_in_browser() 函数并在编写 xpath 或 css 选择器之前读取列出所需数据的位置。
检查一下: https://docs.scrapy.org/en/latest/topics/dynamic-content.html https://docs.scrapy.org/en/latest/topics/debug.html
# import this util
from scrapy.utils.response import open_in_browser
# in spider class
...
def parse_details(self, response):
open_in_browser(response)
...
如果您在使用此示例时遇到问题,那么您可以调用
response.text
并检查响应页面的当前内容