当网址未定义页码时,如何刮取多个页面?

时间:2017-06-27 02:32:41

标签: python web-scraping python-requests

我想从网站的第二页获取html。我习惯于显示页码的网址,让我通过操作来刮掉多个页面。

my_url = 'https://www.bodybuilding.com/exercises/finder/lookup/filter/muscle/id/1/muscle/chest'

headers = {'referer':my_url,
           'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
           'x-requested-with':'XMLHttpRequest'}
payload = {'orderByField':'exerciseName',
           'orderByDirection':'ASC',
           'page':30}
params = {'muscleID':1,
          'exerciseTypeID':[2,6,4,7,1,3,5],
          'equipmentID':[9,14,2,10,5,6,4,15,1,8,11,3,7],
          'mechanicTypeID':[1,2,11]}

r = requests.post(my_url, data=payload, headers=headers, params=params, verify=True)
soup = bs(r.text, 'html.parser')

1 个答案:

答案 0 :(得分:0)

这是一个非常有趣的问题。如果您检查该页面,您会发现该分页是由javascript驱动的,并且不会直接来自任何服务器提供的API。但是,如果您向下调用调用堆栈,则会显示其内部API。这意味着(幸运的是),答案比尝试以某种方式呈现页面/在您的python脚本中运行javascript更简单。

查看exercisesUtil.js,第1329行。这应该让您开始使用他们的基于JSON的API(当您开始使用它时,您会注意到,它仍然在JSON中提供HTML字符串,所以它应该适合你美丽的汤设置)。有一个名为refreshFinderResultSet的函数,其中的ajax调用应该可以让你开始。