我正在使用scrapy和scrapy-selenium,我无法处理分页,因为href只包含# symbol。
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我需要帮助来解决这个分页问题。我该怎么处理呢?任何帮助都将不胜感激。
发布于 2020-08-14 01:35:02
Scrapy中动态内容的探讨
莱恩说的没错。为了扩展这一点,可以通过几种方式获取动态内容。
这是迄今为止最好的获取动态内容的方法,如果可能的话,它是最有效的,而且比selenium更不脆弱。这基于javascript是否正在触发HTTP请求来抓取网页的数据。在这种情况下,在求助于其他方法之前,应该先尝试它
Scrapy有一个集成了splash的中间件。Splash预渲染页面,以便能够访问javascript加载的HTML。它还具有一些浏览器活动功能。比selenium的劳动密集度更低,但仍然是浏览器的活跃度。
这就是你在这里尝试的解决方案,问题是,它并没有真正提供很多选项来进行复杂的浏览器活动。所以它的真正目的是能够抓取真正加载了javascript的HTML。
您可以使用中间件来过滤请求,使用完整的selenium包。当没有其他选择,并且您希望为每个请求提供一些内容时,这是可以接受的。或者你想根据你发出的请求的类型来定制它
在我看来,当所有其他选项都不可用,并且您确实需要针对脚本的特定部分进行复杂的浏览器活动,而不能使用请求来完成时,这是最后的手段。
重新设计请求
现在你已经对它有了一个基本的了解。您的浏览器(我更喜欢chrome)可以访问浏览器发出的所有请求,以显示您所看到的站点。如果查看页面--> network tools --> XHR,您将看到所有AJAX请求(通常是API端点所在的位置)。

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

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

这将在必要时为您提供报头、参数和cookie,以便发出正确的Scrapy请求。在这种情况下,您实际上只需要一个参数来模拟HTTP请求。我倾向于使用requests包来处理我实际需要的东西,因为复制请求会给你提供请求中的所有东西,如果你不需要的话。
发布于 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发出一个请求,即可获得所有清单。
看起来这个网站没有任何真正的“分页”。它只是在第一次请求时加载所有数据,然后进行一些前端操作,根据用户所在的“页面”显示部分结果。
发布于 2020-08-14 04:17:09
我检查了是否有API,但没有找到。
因此,在这种情况下,如果使用Selenium,则需要检查next page按钮是否可用,如果可用,则单击该按钮,然后将HTML标记插入到数组中。
示例:
responses = []
next = driver.find_elements_by_xpath("XPATH")
while len(next) > 0:
next.click()
responses.append(driver.page_source)致以亲切的问候,艾哈迈德
https://stackoverflow.com/questions/63395605
复制相似问题