首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法单击分页中的下一步按钮

无法单击分页中的下一步按钮
EN

Stack Overflow用户
提问于 2020-08-13 20:52:27
回答 4查看 156关注 0票数 2

我正在使用scrapy和scrapy-selenium,我无法处理分页,因为href只包含# symbol。

代码语言:javascript
复制
class PropertyScraperSpider(scrapy.Spider):
    name = 'property_scraper'
    allowed_domains = ['www.samtrygg.se']



    def start_requests(self):
        yield SeleniumRequest(
            url='https://www.samtrygg.se/RentalObject/NewSearch',
            wait_time=3,
            headers=self.headers,
            callback=self.parse_links
        )
        

    def parse_links(self, response):
        cards = response.xpath("//div[@class='owl-carousel owl-theme show-nav-hover']/div/a")

        for card in cards:
            link = card.xpath(".//@href").get()

            print('\n\n:link',len(link))

            yield SeleniumRequest(
                url= link,
                wait_time=3,
                headers=self.headers,
                callback=self.parse,
            )
        next_page = response.xpath("//a[@id='next']/@href").get()

        print('\n\n\nNEXT_PAGE',next_page)
        if next_page:
            absolute_url = f'https://www.samtrygg.se/RentalObject/NewSearch{next_page}'
            yield SeleniumRequest(
                url=absolute_url,
                headers=self.headers,
                wait_time=3,
                callback=self.parse_links
            )
            
    def parse(self,response):
        pass

我需要帮助来解决这个分页问题。我该怎么处理呢?任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

发布于 2020-08-14 01:35:02

Scrapy中动态内容的探讨

莱恩说的没错。为了扩展这一点,可以通过几种方式获取动态内容。

  1. By re-engineering HTTP requests

这是迄今为止最好的获取动态内容的方法,如果可能的话,它是最有效的,而且比selenium更不脆弱。这基于javascript是否正在触发HTTP请求来抓取网页的数据。在这种情况下,在求助于其他方法之前,应该先尝试它

  1. Using Splash (浏览器活动)

Scrapy有一个集成了splash的中间件。Splash预渲染页面,以便能够访问javascript加载的HTML。它还具有一些浏览器活动功能。比selenium的劳动密集度更低,但仍然是浏览器的活跃度。

  1. Using selenium_scrapy (浏览器活动)

这就是你在这里尝试的解决方案,问题是,它并没有真正提供很多选项来进行复杂的浏览器活动。所以它的真正目的是能够抓取真正加载了javascript的HTML。

  1. 在中间件中使用selenium (浏览器活动)

您可以使用中间件来过滤请求,使用完整的selenium包。当没有其他选择,并且您希望为每个请求提供一些内容时,这是可以接受的。或者你想根据你发出的请求的类型来定制它

  1. 在爬虫脚本中直接使用selenium。(浏览器活动)

在我看来,当所有其他选项都不可用,并且您确实需要针对脚本的特定部分进行复杂的浏览器活动,而不能使用请求来完成时,这是最后的手段。

重新设计请求

现在你已经对它有了一个基本的了解。您的浏览器(我更喜欢chrome)可以访问浏览器发出的所有请求,以显示您所看到的站点。如果查看页面--> network tools --> XHR,您将看到所有AJAX请求(通常是API端点所在的位置)。

您可以看到所有的请求,按大小排序的工作方式通常是较大的数据请求。当您单击请求时,您可以访问它发送的标头、响应和响应的预览。

因此,这里有您可能需要的数据的预览。然后,我将以cURL的形式复制此请求,并将其输入到curl.trillworks.com等网站中。

这将在必要时为您提供报头、参数和cookie,以便发出正确的Scrapy请求。在这种情况下,您实际上只需要一个参数来模拟HTTP请求。我倾向于使用requests包来处理我实际需要的东西,因为复制请求会给你提供请求中的所有东西,如果你不需要的话。

票数 3
EN

Stack Overflow用户

发布于 2020-08-13 22:14:29

打开https://www.samtrygg.se/RentalObject/NewSearch时,如果您查看web浏览器发出的请求,则该网站正在使用可见的API

接口地址:https://www.samtrygg.se/RentalObject/SearchResult?search=sverige&neLat=&neLng=&swLat=&swLng=

您只需使用Scrapy向API URL发出一个请求,即可获得所有清单。

看起来这个网站没有任何真正的“分页”。它只是在第一次请求时加载所有数据,然后进行一些前端操作,根据用户所在的“页面”显示部分结果。

票数 2
EN

Stack Overflow用户

发布于 2020-08-14 04:17:09

我检查了是否有API,但没有找到。

因此,在这种情况下,如果使用Selenium,则需要检查next page按钮是否可用,如果可用,则单击该按钮,然后将HTML标记插入到数组中。

示例:

代码语言:javascript
复制
responses = []
next = driver.find_elements_by_xpath("XPATH")
while len(next) > 0:
    next.click()
    responses.append(driver.page_source)

致以亲切的问候,艾哈迈德

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63395605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档