Python 3.x 刮痧蜘蛛找到了一只”;“下一步”;按钮,但不是另一个

Python 3.x 刮痧蜘蛛找到了一只”;“下一步”;按钮,但不是另一个,python-3.x,scrapy,Python 3.x,Scrapy,我正在写一个蜘蛛来刮一个流行评论网站:-)这是我第一次尝试写一个刮蜘蛛 顶层是餐厅列表(我称之为“顶层”),一次显示30家。我的爬行器访问每个链接,然后“单击下一步”获取下一个30,以此类推。这部分工作正常,因为我的输出包含数千家餐厅,而不仅仅是前30家 然后我想让它“点击”到每个餐厅页面的链接(“餐厅级别”),但这只包含被截断的评论版本,所以我想让它再“点击”下一个级别(到“评论级别”),并从那里抓取评论,用另一个“下一步”按钮一次显示5条评论。这是我提取任何东西的唯一“级别”——其他级别都有

我正在写一个蜘蛛来刮一个流行评论网站:-)这是我第一次尝试写一个刮蜘蛛

顶层是餐厅列表(我称之为“顶层”),一次显示30家。我的爬行器访问每个链接,然后“单击下一步”获取下一个30,以此类推。这部分工作正常,因为我的输出包含数千家餐厅,而不仅仅是前30家

然后我想让它“点击”到每个餐厅页面的链接(“餐厅级别”),但这只包含被截断的评论版本,所以我想让它再“点击”下一个级别(到“评论级别”),并从那里抓取评论,用另一个“下一步”按钮一次显示5条评论。这是我提取任何东西的唯一“级别”——其他级别都有链接,可以访问我想要的评论和其他信息

这其中的大部分是有效的,因为我得到了我想要的所有信息,但只针对每个餐厅的前5条评论。它不是“查找”底部“审查级别”上的“下一步”按钮

我曾尝试在parse方法中更改命令的顺序,但除此之外,我没有什么想法!我的XPath很好,所以一定和蜘蛛的结构有关

我的蜘蛛看起来是这样的:

import scrapy
从scrapy.http导入请求
类别TripSpider(刮毛蜘蛛):
名称='tripadvisor'
允许的_域=['tripadvisor.co.uk']
起始URL=['https://www.tripadvisor.co.uk/Restaurants-g187069-Manchester_Greater_Manchester_England.html']
自定义设置={
“下载延迟”:1,
#“深度限制”:3,
“自动跟踪目标并发”:0.5,
“用户代理”:“Mozilla/5.0(Macintosh;英特尔Mac OS X 10_10_1)AppleWebKit/537.36(KHTML,如Gecko)Chrome/39.0.2171.95 Safari/537.36”,
#“深度优先”:1,
#“调度程序磁盘队列”:“scrapy.sques.PickleFifoDiskQueue”,
#“调度程序内存队列”:“scrapy.sques.FifoMemoryQueue”
}
def刮伤检查(自我、响应):
餐厅名称\u review=response.xpath('//div[@class=“wrap”]//span[@class=“taLnk”]//text()).extract()
审阅者_name=response.xpath('//div[@class=“username mo”]//text()).extract()
review_rating=response.xpath('//div[@class=“wrap”]/div[@class=“rating reviewItemInline”]/span[以(@class,“ui_bubble_rating”)]开头)。extract()
review_title=response.xpath('//div[@class=“wrap”]//span[@class=“noQuotes”]//text()).extract()
全文回顾=response.xpath('//div[@class=“wrap”]/div[@class=“prw\u rup prw\u reviews\u text\u summary\u hsx”]/div[@class=“entry”]/p')。摘录()
review\u date=response.xpath('//div[@class=“prw\u rup prw\u reviews\u stay\u date\u hsx”]/text()[not(parent::script)]).extract()
餐厅名称=response.xpath('//div[@id=“listing\u main\u sur”]//a[@class=“HEADING”]///text()).extract()*len(完整评论)
餐厅评级=response.xpath('//div[@class=“userRating”]//@alt').extract()*len(完整评论)
餐厅审核次数=response.xpath('//div[@class=“userRating”]//a//text()')。摘录()*len(完整审核)
对于邮政编码的rvn、rvr、rvt、fr、rd、rn、rr、rvc(审核人姓名、审核评级、审核标题、完整审核、审核日期、餐厅名称、餐厅评级、餐厅审核计数):
评论dict=dict(zip(['reviewer_name'、'review_rating'、'review_title'、'full_reviews'、'review_date'、'restaurant_name'、'restaurant_rating'、'restaurant_review_count'],(rvn、rvr、rvt、fr、rd、rn、rr、rvc)))
收益率审查
#打印(评论内容)
def解析(自我,响应):
###解析方法实际上是重复/迭代的方法
在自我审查中进行审查(答复):
收益率审查
#打印(审查)
#进入餐厅的下一页
next_page_restaurants=response.xpath('//a[@class=“nav next rndBtn ui_button primary taLnk”]/@href')。首先提取()
下一页餐厅url=response.urljoin(下一页餐厅)
产量请求(下一页餐厅url)
打印(下一页餐厅url)
#访问评论的下一页
next_page_reviews=response.xpath('//a[@class=“nav next taLnk”]/@href')。首先提取()
next\u page\u reviews\u url=response.urljoin(next\u page\u reviews)
让步请求(下一页\u评论\u url)
打印(下一页\u评论\u url)
#访问每个餐厅页面:
url=response.xpath('//div[@id=“EATERY\u SEARCH\u RESULTS”]/div/div/div/a[@target=“\u blank”]/@href')。extract()
对于url中的下一个url\u:
url\u full=response.urljoin(url\u next)
屈服请求(url\u完整)
#“访问第一次审阅以获取完整审阅(不是截断版本)”
first_review=response.xpath('//a[@class=“title”]/@href').extract_first()#extract first用作我只想访问此页面上的一个链接以进入“审阅级别”
first\u review\u full=response.urljoin(first\u review)
产量申请(第一次审查全部)
#打印(第一次检查完整)

类值末尾缺少空格:

试试这个:

next_page_reviews = response.xpath('//a[@class="nav next taLnk "]/@href').extract_first()
以下是有关部分匹配类的一些提示:


另一方面,您可以定义单独的解析函数,以明确每个函数的职责:

您可以发布一个您试图获取的实际链接吗?当然,我的起始URL是感谢malberts。您所在的页面是餐厅页面,其中仅包含部分评论(如果评论很长)。爬行器应该进入该页面上的一个评论,并从评论级别中删除评论,因为它们已经在那里完成了。我发布的xpath与“下一步”按钮匹配。在我昨天发布这篇文章之后,我发现了回调,我认为这可能会对网站的结构有所帮助,所以今天我将尝试实现它。