首页 > 解决方案 > 在线服务或命令行实用程序从 json api 变化页面参数中获取多个页面

问题描述

是否有一些在线实用程序或命令行应用程序可以让我做这样的事情:

curl_pages "http://xxxx.api.users?param1=v1&param2=v2&len=100&page={{page}}"

这样它就会从改变{{page}}参数的 url 中获取数据,直到返回一个空数组,然后给我一个 json 单个文件,其中包含所有结果?

开发起来很简单,但我想这是一个相当不错的命令,而且一定有人已经发明了它......


仅作记录,以防有人发现它有用,这是我想出的快速而肮脏的解决方案:

const fetch = require('node-fetch');
const fs = require('fs');

const main = async () => {

  // process params
  if (process.argv.length < 5) {
    console.error('bad parameters. usage:')
    console.error('  node --tls-min-v1.0 fetch.js <url> <from> <to>')
    console.error('')
    console.error('  url: url to be fetched. ej: https://myservice/api/users?p1=v1&page={{page}}&len=10')
    console.error('  from: number of first page to fetch')
    console.error('  to: number of last page to fetch')
    process.exit(1)
  }

  const url = process.argv[2]
  const from_page = parseInt(process.argv[3])
  const to_page = parseInt(process.argv[4])

  let data = []
  let page = from_page
  let page_data = []

  page_data = await fetch_page(url, page++)
  data = [...data, page_data]

  while (page <= to_page && page_data.length > 0) {
    if (page % 10 === 0)
      console.log(`procesando pagina ${page}/${to_page-from_page+1}`)
    page_data = await fetch_page(url, page++)
    data = [...data, page_data]
  }

  const json = JSON.stringify(data.flat(), null, 2)
  fs.writeFileSync('output.json', json, 'utf8')
}

const fetch_page = async (url, p) => {
  url = url.replace('{{page}}', p.toString())
  const response = await fetch(url)
  return await response.json()
}

main()

标签: web-scraping

解决方案


Curl 将采用数字范围:

curl "http://xxxx.api.users?param1=v1&param2=v2&len=100&page=[1-100]"

Burp Suite 也很受欢迎。


推荐阅读