为了账号安全,请及时绑定邮箱和手机立即绑定

scrapy+selenium 一旦我完成一个页面列表,如何抓取不同的页面列表?

scrapy+selenium 一旦我完成一个页面列表,如何抓取不同的页面列表?

胡说叔叔 2023-07-11 14:38:01
我正在尝试从“操作/用户交易”网站上抓取数据,它是意大利语,所以我会尽力尽可能清楚。我对 Python 和 Scrapy 也很陌生,这是我的第一个项目。该网站没有一个简单的方法来跟踪链接,所以我不得不想出一些东西。首先,我进入总列表,其中列出了所有页面,这非常简单,因为第一页是“https://www.subito.it/annunci-italia/vendita/usato/?o=1”,然后进入在“/?o=218776”上,我选择页面的第一个链接并用硒打开它,一旦在这里我得到了我需要的数据并单击“下一页”按钮,但这是棘手的部分。如果我使用相同的 URL 进入同一页面,则没有“下一页”按钮,只有当您位于列表页面的第一个页面,然后单击页面链接时,它才起作用,从这里您现在可以点击其他链接。我以为它会完成,但我错了。一般列表分为页面(.../?o=1、.../?o=2 等),每个页面有 X 个链接(我没有数过),当您打开时拍卖页面之一(来自列表页面,因此您可以使用“下一页”按钮),然后单击“下一页”,然后按照总列表中的链接顺序进行操作。更清楚地说,如果总列表有 200k 页,每页有 50 个链接,当您单击该页的第一个链接时,您可以单击“下一页”49 次,之后“下一页”按钮将处于非活动状态并且您无法转到较旧的链接,您必须返回列表并转到下一页,然后重复该过程。但是我错了。一般列表分为页面(.../?o=1、.../?o=2 等),每个页面有 X 个链接(我没有数过),当您打开时拍卖页面之一(来自列表页面,因此您可以使用“下一页”按钮),然后单击“下一页”,然后按照总列表中的链接顺序进行操作。更清楚地说,如果总列表有 200k 页,每页有 50 个链接,当您单击该页的第一个链接时,您可以单击“下一页”49 次,之后“下一页”按钮将处于非活动状态并且您无法转到较旧的链接,您必须返回列表并转到下一页,然后重复该过程。但是我错了。一般列表分为页面(.../?o=1、.../?o=2 等),每个页面有 X 个链接(我没有数过),当您打开时拍卖页面之一(来自列表页面,因此您可以使用“下一页”按钮),然后单击“下一页”,然后按照总列表中的链接顺序进行操作。更清楚地说,如果总列表有 200k 页,每页有 50 个链接,当您单击该页的第一个链接时,您可以单击“下一页”49 次,之后“下一页”按钮将处于非活动状态并且您无法转到较旧的链接,您必须返回列表并转到下一页,然后重复该过程。当您进入拍卖页面之一(来自列表页面,因此您可以使用“下一页”按钮)并单击“下一页”时,您将按照总列表中的链接顺序进行操作。更清楚地说,如果总列表有 200k 页,每页有 50 个链接,当您单击该页的第一个链接时,您可以单击“下一页”49 次,之后“下一页”按钮将处于非活动状态并且您无法转到较旧的链接,您必须返回列表并转到下一页,然后重复该过程。当您进入拍卖页面之一(来自列表页面,因此您可以使用“下一页”按钮)并单击“下一页”时,您将按照总列表中的链接顺序进行操作。更清楚地说,如果总列表有 200k 页,每页有 50 个链接,当您单击该页的第一个链接时,您可以单击“下一页”49 次,之后“下一页”按钮将处于非活动状态并且您无法转到较旧的链接,您必须返回列表并转到下一页,然后重复该过程。
查看完整描述

1 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

可以通过覆盖start_requests方法在页面上进行迭代。为了达到这个目的,你需要编写一个循环来请求所有(在本例中为219xxx)页面并提取第二层页面href。


def start_requests(self):

     pages_count = 1 # in this method you need to hard code your pages quantity

     for i in range(pages_count)

          url = 'https://www.subito.it/annunci-italia/vendita/usato/?o=%s' % str(i + 1)

          scrapy.Request(url, callback=self.parse)

或者以更好的方式 slso 找出第一层中有多少页,该层始终位于最后一个class="unselected-page"元素中,以便您可以使用 找到它response.xpath('//*[@class="unselected-page"]//text()').getall()[-1] 。在这种情况下,您需要在第一种parse方法中发出对第一层页面的请求。


def start_requests(self):

     base_url = 'https://www.subito.it/annunci-italia/vendita/usato'

     scrapy.Request(base_url, callback=self.parse_first_layer)


def parse_first_layer(self, response):

     pages_count = int(response.xpath('//*[@class="unselected-page"]//text()').getall()[-1])

     for i in range(pages_count)

          url = 'https://www.subito.it/annunci-italia/vendita/usato/?o=%s' % str(i + 1)

          scrapy.Request(url, callback=self.parse_second_layer)

到达第一层链接后,您可以像以前一样在每个页面中迭代 50 多个链接。


查看完整回答
反对 回复 2023-07-11
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信