我在刮网站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 ?
1条答案
按热度按时间ahy6op9u1#
我只是碰巧自己修复了它。这种功能包含在scrapy中。我的代码的问题是,我没有使用
yield
命令,而是导入了请求库。因此,发送的请求是唯一的,与最初的请求没有任何联系,使它们毫无用处。我把这篇文章放在网上,以防别人发现同样的问题。
修复此问题的代码: