使用Scrapy抓取二级请求依赖于初始请求的无限滚动站点

vxf3dgd4  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(132)

我在刮网站schwaebischealb.de
该页面具有无限滚动功能,当用户滚动到底部时(有时需要点击“显示更多”),会向[参数:页=n] https://www.schwaebischealb.de/salb/ukv/result/?page=n,其中n= 2,3,......,n。
我想抓取所有的站点并解析产品。代码如下。问题是,子页面不包含产品,当用scrapy解析时,初始页面工作正常。当在inkognito标签中打开子页面时,出现同样的问题。我还尝试用Postman访问它们,就在我访问初始页面后,工作正常,它们包含产品。预期的功能显然是,Scrapy应该能够向子页面发送请求,并且相应的响应包含产品,就像网页的正常工作流程一样。

class AlbSpider(scrapy.Spider):
name = 'alb'
fromDate = "28.07.2022"  # dd.mm.yyy
toDate = "05.08.2022"
numNights = 8
numPersons = "2"
numRooms = numPersons
room1NumAdults = "1"  # number of adults in room 1
room2NumAdults = "1"  # number of adults in room 2
maxPrice = 800  # max price of the accommodation
siteCounter = 1
siteMaxCount = 25  # max count is 25
start_urls = [(f'https://www.schwaebischealb.de/salb/ukv?searchtext=&date_from={fromDate}'
               f'&date_to={toDate}&numberOfRooms={numRooms}&number_adult%5B%5D={room1NumAdults}&number_child%5B%5D=0'
               f'&age_child1%5B%5D=&age_child2%5B%5D=&age_child3%5B%5D=&age_child4%5B%5D=&number_adult%5B%5D={room2NumAdults}'
               f'&number_child%5B%5D=0&age_child1%5B%5D=&age_child2%5B%5D=&age_child3%5B%5D=&age_child4%5B%5D='
               f'&number_adult%5B%5D=&number_child%5B%5D=0&age_child1%5B%5D=&age_child2%5B%5D=&age_child3%5B%5D='
               f'&age_child4%5B%5D=&doSearch={siteCounter}&active_tab=')]

def parse(self, response):
    # clear json file
    with open("alb.json", "w") as f:
        f.write("")
    self.parseSite(response.url)
    newSiteUrl = "https://www.schwaebischealb.de/salb/ukv/result/?page=##site##"
    url = newSiteUrl.replace("##site##", str(self.siteCounter))
    while self.pageValid(url):
        self.parseSite(url)
        self.siteCounter += 1
        url = newSiteUrl.replace("##site##", str(self.siteCounter))

def pageValid(self, url):
    # ensures that the page is valid, which is the case for all pages until page 26
    if int(url.split("=")[-1]) <= self.siteMaxCount:
        return True
    return False

我在网上做了一些搜索,但我只找到了基本的“无限滚动”教程,但没有一个二级请求依赖于初始请求的教程。
有没有一个功能可以处理这类问题?或者可能是其他库,如 selenium ?

ahy6op9u

ahy6op9u1#

我只是碰巧自己修复了它。这种功能包含在scrapy中。我的代码的问题是,我没有使用yield命令,而是导入了请求库。因此,发送的请求是唯一的,与最初的请求没有任何联系,使它们毫无用处。
我把这篇文章放在网上,以防别人发现同样的问题。
修复此问题的代码:

def parse(self, response):
    # clear json file
    with open("alb.json", "w") as f:
        f.write("")
    yield scrapy.Request(response.url, callback=self.parseSite)
    newSiteUrl = "https://www.schwaebischealb.de/salb/ukv/result/?page=##site##"
    url = newSiteUrl.replace("##site##", str(self.siteCounter))
    while self.pageValid(url):
        yield scrapy.Request(url, callback=self.parseSite)
        self.siteCounter += 1
        url = newSiteUrl.replace("##site##", str(self.siteCounter))

相关问题