{"_id":"x-ray-scraper","_rev":"8-e31522a6dc9338951c03f11b9954ec29","name":"x-ray-scraper","dist-tags":{"latest":"3.0.6"},"versions":{"3.0.0":{"name":"x-ray-scraper","description":"Scraper next gen based on x-ray (2.3.2)","homepage":"https://github.com/JimmyLaurent/x-ray-scraper#readme","version":"3.0.0","main":"index.js","author":{"name":"Jimmy Laurent"},"repository":{"type":"git","url":"git://github.com/JimmyLaurent/x-ray-scraper.git"},"bugs":{"url":"https://github.com/JimmyLaurent/x-ray-scraper/issues"},"keywords":["api","cheerio","scrape","scraper","structure","web"],"dependencies":{"bluebird":"^3.5.1","cheerio":"~0.22.0","debug":"~3.1.0","enqueue":"^1.0.2","enstore":"^1.0.1","format-parser":"^0.0.2","http-context":"^1.1.1","is-url":"~1.2.0","isobject":"~3.0.0","ms":"^2.1.1","superagent":"^3.8.2","superagent-proxy":"^1.0.3","wrap-fn":"^0.1.5"},"devDependencies":{"concat-stream":"^1.6.1","eslint":"^4.18.2","multiline":"1.0.2","rimraf":"^2.6.2","jest":"^22.4.2"},"scripts":{"test":"jest","lint":"eslint ."},"prettier":{"singleQuote":true,"trailingComma":"none","semi":true,"tabWidth":2},"license":"MIT","gitHead":"ae0c13754d6749321a271b0f867cb5eba9ab84e6","_id":"x-ray-scraper@3.0.0","_npmVersion":"5.3.0","_nodeVersion":"9.5.0","_npmUser":{"name":"jimmylaurent","email":"jimlaurent0@gmail.com"},"dist":{"integrity":"sha512-whVivJUvqasy3tuspPhp69QAi+nOdDDht7ZUf1s5cnhUQeKT++zbyLnTq4nhggaiRslldXchh8K2FA1gJJCVew==","shasum":"947ef91a48038b5e49eab8e85ca70719da031285","tarball":"https://registry.npmjs.org/x-ray-scraper/-/x-ray-scraper-3.0.0.tgz","fileCount":23,"unpackedSize":179610,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCvPYiP9a+B4jrwe2kiWYkl3KPjfAOXVuuu4bRYWVt93wIgdEfUHQC9HwmT7+Ixh9h2MJ01ozguAi2bVuVLk/zMuEM="}]},"maintainers":[{"name":"jimmylaurent","email":"jimlaurent0@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x-ray-scraper_3.0.0_1521114644942_0.48715237263121325"},"_hasShrinkwrap":false},"3.0.1":{"name":"x-ray-scraper","description":"Scraper next gen based on x-ray (2.3.2)","homepage":"https://github.com/JimmyLaurent/x-ray-scraper#readme","version":"3.0.1","main":"index.js","author":{"name":"Jimmy Laurent"},"repository":{"type":"git","url":"git://github.com/JimmyLaurent/x-ray-scraper.git"},"bugs":{"url":"https://github.com/JimmyLaurent/x-ray-scraper/issues"},"keywords":["api","cheerio","scrape","scraper","structure","web"],"dependencies":{"bluebird":"^3.5.1","cheerio":"~0.22.0","debug":"~3.1.0","enqueue":"^1.0.2","enstore":"^1.0.1","format-parser":"^0.0.2","http-context":"^1.1.1","is-url":"~1.2.0","isobject":"~3.0.0","ms":"^2.1.1","superagent":"^3.8.2","superagent-proxy":"^1.0.3","wrap-fn":"^0.1.5"},"devDependencies":{"concat-stream":"^1.6.1","eslint":"^4.18.2","multiline":"1.0.2","rimraf":"^2.6.2","jest":"^22.4.2"},"scripts":{"test":"jest","lint":"eslint ."},"prettier":{"singleQuote":true,"trailingComma":"none","semi":true,"tabWidth":2},"license":"MIT","gitHead":"d9c472bba9e221cec4e797434f3660812941ea7f","_id":"x-ray-scraper@3.0.1","_npmVersion":"5.6.0","_nodeVersion":"9.5.0","_npmUser":{"name":"jimmylaurent","email":"jimlaurent0@gmail.com"},"dist":{"integrity":"sha512-lJvVTn7QjxJFoUkZE5HpnB2S4QhWLk70NbdXe1/0PO5p0vWAOkmhnwhQExaNN0+P3kJLquQkFB0XAqmh93+utQ==","shasum":"d3500ea328d03adaf17e8a5b1cd8f9842b93b6a0","tarball":"https://registry.npmjs.org/x-ray-scraper/-/x-ray-scraper-3.0.1.tgz","fileCount":22,"unpackedSize":175017,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCSa4XGFZkSKja9GwEZCg1meAS4BMswZyfum47dkvU3JwIhAN66xWPl4Emy2+fxH1xiKbmn4GxnW4yTqPpGtdQXyd9M"}]},"maintainers":[{"name":"jimmylaurent","email":"jimlaurent0@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x-ray-scraper_3.0.1_1521747487054_0.6406017517153162"},"_hasShrinkwrap":false},"3.0.2":{"name":"x-ray-scraper","description":"Scraper next gen based on x-ray (2.3.2)","homepage":"https://github.com/JimmyLaurent/x-ray-scraper#readme","version":"3.0.2","main":"index.js","author":{"name":"Jimmy Laurent"},"repository":{"type":"git","url":"git://github.com/JimmyLaurent/x-ray-scraper.git"},"bugs":{"url":"https://github.com/JimmyLaurent/x-ray-scraper/issues"},"keywords":["api","cheerio","scrape","scraper","structure","web"],"dependencies":{"bluebird":"^3.5.1","cheerio":"~0.22.0","debug":"~3.1.0","enqueue":"^1.0.2","enstore":"^1.0.1","format-parser":"^0.0.2","http-context":"^1.1.1","is-url":"~1.2.0","isobject":"~3.0.0","ms":"^2.1.1","superagent":"^3.8.2","superagent-proxy":"^1.0.3","wrap-fn":"^0.1.5"},"devDependencies":{"concat-stream":"^1.6.1","eslint":"^4.18.2","multiline":"1.0.2","rimraf":"^2.6.2","jest":"^22.4.2"},"scripts":{"test":"jest","lint":"eslint ."},"prettier":{"singleQuote":true,"trailingComma":"none","semi":true,"tabWidth":2},"license":"MIT","gitHead":"393399aabbdacaab33f82a6db4d686713779736c","_id":"x-ray-scraper@3.0.2","_npmVersion":"5.3.0","_nodeVersion":"9.5.0","_npmUser":{"name":"jimmylaurent","email":"jimlaurent0@gmail.com"},"dist":{"integrity":"sha512-4WU1kwNswDClQsnAUTwbqpPhA+J9/Te8SG9cCEg3Gm/OHFeRXnIFrTli5vXZxXaOPaZERVhG3Jzg5OTJhFy5eA==","shasum":"f8d047d41933b98f6d6cd099c3049e80ff73426a","tarball":"https://registry.npmjs.org/x-ray-scraper/-/x-ray-scraper-3.0.2.tgz","fileCount":23,"unpackedSize":180560,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDAi7FXikbqko7/7DMuONSJWu1dpKo3uHtGiImH6qZ2DgIgFawqIIgofgxZ65tyewUGG74dhmbq3KCMZN8iFPT8lzc="}]},"maintainers":[{"name":"jimmylaurent","email":"jimlaurent0@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x-ray-scraper_3.0.2_1522053302290_0.5432061491399505"},"_hasShrinkwrap":false},"3.0.3":{"name":"x-ray-scraper","description":"Scraper next gen based on x-ray (2.3.2)","homepage":"https://github.com/JimmyLaurent/x-ray-scraper#readme","version":"3.0.3","main":"index.js","author":{"name":"Jimmy Laurent"},"repository":{"type":"git","url":"git://github.com/JimmyLaurent/x-ray-scraper.git"},"bugs":{"url":"https://github.com/JimmyLaurent/x-ray-scraper/issues"},"keywords":["api","cheerio","scrape","scraper","structure","web"],"dependencies":{"bluebird":"^3.5.1","cheerio":"~0.22.0","debug":"~3.1.0","enqueue":"^1.0.2","enstore":"^1.0.1","format-parser":"^0.0.2","http-context":"^1.1.1","is-url":"~1.2.0","isobject":"~3.0.0","ms":"^2.1.1","superagent":"^3.8.2","superagent-proxy":"^1.0.3","wrap-fn":"^0.1.5"},"devDependencies":{"concat-stream":"^1.6.1","eslint":"^4.18.2","multiline":"1.0.2","rimraf":"^2.6.2","jest":"^22.4.2"},"scripts":{"test":"jest","lint":"eslint ."},"prettier":{"singleQuote":true,"trailingComma":"none","semi":true,"tabWidth":2},"license":"MIT","gitHead":"70efe5cfd6654eede95f1744ff96748e5ba38a8d","_id":"x-ray-scraper@3.0.3","_npmVersion":"5.3.0","_nodeVersion":"9.5.0","_npmUser":{"name":"jimmylaurent","email":"jimlaurent0@gmail.com"},"dist":{"integrity":"sha512-fU0VCxLa+Lrr3G4XhDWBwwsyfmKb4EsrMJu+UJEdtemW6j7310jLflqze57wgk+g2rXiksTDcRa5wMngLmzzJQ==","shasum":"5cbd0c5221f512c3ab28d1f81d21e4203f3d4b1c","tarball":"https://registry.npmjs.org/x-ray-scraper/-/x-ray-scraper-3.0.3.tgz","fileCount":23,"unpackedSize":180632,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICSX1msMHkwHceTzYjzrjamR587LiYXmPiwpgXGaxf8qAiEAolX5+wAPmkkAl7WB7tPvssojcQ8eByJvAaiO4yFWnHI="}]},"maintainers":[{"name":"jimmylaurent","email":"jimlaurent0@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x-ray-scraper_3.0.3_1522413894284_0.01518033199312474"},"_hasShrinkwrap":false},"3.0.4":{"name":"x-ray-scraper","description":"Scraper next gen based on x-ray (2.3.2)","homepage":"https://github.com/JimmyLaurent/x-ray-scraper#readme","version":"3.0.4","main":"index.js","author":{"name":"Jimmy Laurent"},"repository":{"type":"git","url":"git://github.com/JimmyLaurent/x-ray-scraper.git"},"bugs":{"url":"https://github.com/JimmyLaurent/x-ray-scraper/issues"},"keywords":["api","cheerio","scrape","scraper","structure","web"],"dependencies":{"bluebird":"^3.5.1","cheerio":"~0.22.0","debug":"~3.1.0","enqueue":"^1.0.2","enstore":"^1.0.1","format-parser":"^0.0.2","http-context":"^1.1.1","is-url":"~1.2.0","isobject":"~3.0.0","ms":"^2.1.1","superagent":"^3.8.2","superagent-proxy":"^1.0.3","wrap-fn":"^0.1.5"},"devDependencies":{"concat-stream":"^1.6.1","eslint":"^4.18.2","multiline":"1.0.2","rimraf":"^2.6.2","jest":"^22.4.2"},"scripts":{"test":"jest","lint":"eslint ."},"prettier":{"singleQuote":true,"trailingComma":"none","semi":true,"tabWidth":2},"license":"MIT","gitHead":"54b2ce1dc5ec5a5f5bd6e79fc6c8213e73daf61f","_id":"x-ray-scraper@3.0.4","_npmVersion":"5.6.0","_nodeVersion":"9.5.0","_npmUser":{"name":"jimmylaurent","email":"jimlaurent0@gmail.com"},"dist":{"integrity":"sha512-oM5QEStEVksbszskASeUyJ+Q43xgirPtSxXqlujqwJ73fcgXGg0XviojZXMI6+WVTabkDfetzvRfGqAMAxG5jg==","shasum":"936027dac917940d49ebb04bd528224ad48313e4","tarball":"https://registry.npmjs.org/x-ray-scraper/-/x-ray-scraper-3.0.4.tgz","fileCount":22,"unpackedSize":175037,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa+CtACRA9TVsSAnZWagAAkbIP/1ty8CxfD6vOZbGeMmPm\nU2vmzAu3Zkb9OmaJMrIMvzr0B6ngHeUi/Sr8l5Tpv1yqGoaRsbf6w6IO/yPZ\n1zZwZ7PNAzLhwC4AZAaO2axmM5nspWLR+oaZi00tyBhAg47uBHM+c9RLl4Kl\n0sAHOz9Wo1MuxjmczyZ9ITLcgJK3CxxoAEwtux1Oy+6SgFWUiPHIS6Gxd6Wp\ntt4k6DylHUehI5hTuSCRBYwCNS6a0PuIrimAA7BxBjHBPD85VOgFf+QweSZk\n1Ms6Q7CToSDp0Mfyph9TaMzekcvZS7HXjCKG5tP/AEi7h2+XC5dA9QCjc/ze\nzhrXQ4cligwKJA+ullPOqAbEWZvDTP7V4r9BjBJsZgC8ArLTVXT8Q+yGJMMt\nP/qIsSJqDtA0uT72ZT+qyZNqKcfVYlopLhNQd9d3meC85MKhHMxWVnMxmBXe\nUWsb3/NmRnjsZsF9JBlgi7zwdDKlc3Ym2odnSmU1om69Ei6tnIytvaEVOuOE\nBBhBvRTek3qS3iJwLi66/rOxh3xbYlKI82K17kB431dQHumt7UHP46hYIOLC\nLum42C/eayf9k8Kdiyx584FILFB6KYytqDliS83Kj08T5e0DV5Gw4PGuXzN1\nQImwZd+2EDE3cL8eGcU+Ki7vLzuGlVsZClITxjAe1rA4liVv1Vw3dV7e9xBz\n8jCf\r\n=awS4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDMlShjYob3w8j4C3WBYIVapRoN5hUFBPIkMlgd0tOAVwIhAPxKqe6/p/ibEU9+tjFJx1JrxggfraB/+U3LO6Vlqflz"}]},"maintainers":[{"name":"jimmylaurent","email":"jimlaurent0@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x-ray-scraper_3.0.4_1526213439261_0.7682681457668095"},"_hasShrinkwrap":false},"3.0.5":{"name":"x-ray-scraper","description":"Scraper next gen based on x-ray (2.3.2)","homepage":"https://github.com/JimmyLaurent/x-ray-scraper#readme","version":"3.0.5","main":"index.js","author":{"name":"Jimmy Laurent"},"repository":{"type":"git","url":"git://github.com/JimmyLaurent/x-ray-scraper.git"},"bugs":{"url":"https://github.com/JimmyLaurent/x-ray-scraper/issues"},"keywords":["api","cheerio","scrape","scraper","structure","web"],"dependencies":{"bluebird":"^3.5.1","cheerio":"~0.22.0","debug":"~3.1.0","enqueue":"^1.0.2","enstore":"^1.0.1","format-parser":"^0.0.2","http-context":"^1.1.1","is-url":"~1.2.0","isobject":"~3.0.0","ms":"^2.1.1","superagent":"^3.8.2","superagent-proxy":"^1.0.3","wrap-fn":"^0.1.5"},"devDependencies":{"concat-stream":"^1.6.1","eslint":"^4.18.2","multiline":"1.0.2","rimraf":"^2.6.2","jest":"^22.4.2"},"scripts":{"test":"jest","lint":"eslint ."},"prettier":{"singleQuote":true,"trailingComma":"none","semi":true,"tabWidth":2},"license":"MIT","gitHead":"c89ce96b73ffeee290c65385fbd73f9b67f6d1e4","_id":"x-ray-scraper@3.0.5","_npmVersion":"5.6.0","_nodeVersion":"9.5.0","_npmUser":{"name":"jimmylaurent","email":"jimlaurent0@gmail.com"},"dist":{"integrity":"sha512-RUTzEzN6MJX1BMr7W5ZSttpMhuggwlSygiXt83fNHrR4YH2UuC4yWTqjvHzpVX078ALRKR9pikX9VjhJxaUgRg==","shasum":"3ac23fd6627ba1a9c19d22bc2c699b7c8fddfbff","tarball":"https://registry.npmjs.org/x-ray-scraper/-/x-ray-scraper-3.0.5.tgz","fileCount":22,"unpackedSize":175121,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbO49UCRA9TVsSAnZWagAAR8IQAKUM5QNkhlWDXR+BfZqf\nmW5K+2Vy69nqt2iwhdmfPPqdB84vHcFfNDiQu2K5UoWDIpKdb/hTaz0sPOYx\nvzdw0nn0zaUL97eU4K8Lp/GQlMeO5D7YIXbDLcbrcwB4Xu4vDJlXFWuHXEQZ\nInNVrBUsJgaaCC0O887EeJCpSeOjW89S+cIuHHk/zzJd7BHuGojxEECwPD3H\nUPZ/30x406VD8qLTaEqrt6v2bwKQberz+hrmlet/d4Z0sFu4KDYR6jo8T+Bg\n9HEfXU6OoQLVr/TsKPx/243mJ1oPfyYX3f0YCr3sIHgMEOo6B/jvoQTknYvr\nBp991ujLGhknsW483eiNdtpzzbUayoEohzcNRPOgXni8MJvGKtlS/AiHQ7jT\nBaCMMhvbP9eRpetBuLIivxH1tyT53/LZb2ZON0NdpB0MiPhaPjSo2AXbmQKq\nOXIW1X2IwV5VydhmPHEblzW5brU2/os62t9Sz3dvNIP+8n7rLf5TQzY8xEpi\ncXQkNvQuy2F6xJFEO5VfOetIZIQcFHZJCtMcpuII/8dTJPXD8RJgCeP24KnH\n4zi0V+UWTF6vkFhjI/7LFxFZLHkUbN2mrOpTgQQ2g1pcfWAKyHFk8tWYUnck\n7FJCSiLFsKuR1EUpqvDGo24LJbw30Juoshcb5ytcr45cFL9v73MFCqb0XlZy\nGhaR\r\n=KYa3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDQm8nPgABVafo1p9XvkkYp6VBL/NsG+9F1XAdOKkw9TgIgQgBoyT+ASkTx0O47O682bCt9Rt8ElHfOsbso420106I="}]},"maintainers":[{"name":"jimmylaurent","email":"jimlaurent0@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x-ray-scraper_3.0.5_1530629972557_0.3162998965989954"},"_hasShrinkwrap":false},"3.0.6":{"name":"x-ray-scraper","description":"Scraper next gen based on x-ray (2.3.2)","homepage":"https://github.com/JimmyLaurent/x-ray-scraper#readme","version":"3.0.6","main":"index.js","author":{"name":"Jimmy Laurent"},"repository":{"type":"git","url":"git://github.com/JimmyLaurent/x-ray-scraper.git"},"bugs":{"url":"https://github.com/JimmyLaurent/x-ray-scraper/issues"},"keywords":["api","cheerio","scrape","scraper","structure","web"],"dependencies":{"bluebird":"^3.5.1","cheerio":"~0.22.0","debug":"~3.1.0","enqueue":"^1.0.2","enstore":"^1.0.1","format-parser":"^0.0.2","http-context":"^1.1.1","is-url":"~1.2.0","isobject":"~3.0.0","ms":"^2.1.1","superagent":"^3.8.2","superagent-proxy":"^2.0.0","wrap-fn":"^0.1.5"},"devDependencies":{"concat-stream":"^1.6.1","eslint":"^4.18.2","multiline":"1.0.2","rimraf":"^2.6.2","jest":"^22.4.2"},"scripts":{"test":"jest","lint":"eslint ."},"prettier":{"singleQuote":true,"trailingComma":"none","semi":true,"tabWidth":2},"license":"MIT","gitHead":"ff58dbcf1ceb35ea2e008ec743878469bd249f9c","_id":"x-ray-scraper@3.0.6","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-s6j/blD6My9TCxy8XMuDaLyrRPift+ilwyHlktXSNPucS/0npTmV7webDPgYtc5C8EefzpmI9aBds1DUvCRFzA==","shasum":"5b836f37685b22487a761b26ea0be25b902b9cfd","tarball":"https://registry.npmjs.org/x-ray-scraper/-/x-ray-scraper-3.0.6.tgz","fileCount":21,"unpackedSize":33609,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe25NMCRA9TVsSAnZWagAAeaIP/3LIfcY6VY/0JHAnLUhe\nbERRBcYYsLNPG6eZWyk4uW8lmoT+DdqSla14nUjvqZegAsWri7OZtW/wXJa7\nVuJ00sIxNSdoUyZi/314AjXiHm2AzvP5X2nyz3IUMCSJMsAiSXVAVnP8l3lm\nzDrl219tMoICIh4QcPUGDukMW9J/WL8cMRRkZ0S2iyxLpH5rq3QytOyswHux\n7OgVW6qL3wKromLlYHEKGid5Pbb7mdI9hErd2M9gkWJRH2ZvdgKFA5jCKcKq\nFuHyTuuxKa9/FsNJ/jVgJrm4y/gz8LfmMdtlrVB2+yqKclGWOHXaaG62DMOP\n35BDb45A42JY3ddUjY5TGWGuaTcP0osXI3tqKg/EPdSDUWxYeFj4A87rmReW\nTJQk50oBuDxWT9rsZ083KX3rwcFqrdhuKdEHysiyZ0Tf5Ga30N36/fFLaggN\ng2CYtJdHFjo0+jP9EHmDp8YymIV0Ix6vkGuA5iVlBdbHAAZ5Beuh4OrHHm8k\nm0O6nqk9DKAH9E4bI6hjgd7aL5SZTBCGHKKCba3mCepdTnO2ABokMysfTa7p\nRVeyVxSxnICwcj8+BiMoQnZySuE1/SCIseRC6UvmmFjt20uUFNpbhHugkpn4\njqHpU+6jvXikDN5g/ydUxHrqC0npZyB+SnEfDgxX1+hJX3GbwkDJGI3Fz4Wc\nMorR\r\n=v8LR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDMqn9NO4w5B5FPSsyDQeSCYNPadBlvWQAhamX669JjhAiEAyHM2kBe31sG5WiQUZiefu2XCNAhakxNHLtm6fEIt/C8="}]},"maintainers":[{"name":"jimmylaurent","email":"jimlaurent0@gmail.com"}],"_npmUser":{"name":"jimmylaurent","email":"jimlaurent0@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/x-ray-scraper_3.0.6_1591448396412_0.31373310947027466"},"_hasShrinkwrap":false}},"time":{"created":"2018-03-15T11:50:44.942Z","3.0.0":"2018-03-15T11:50:45.015Z","modified":"2022-05-24T21:09:41.108Z","3.0.1":"2018-03-22T19:38:07.113Z","3.0.2":"2018-03-26T08:35:02.371Z","3.0.3":"2018-03-30T12:44:54.425Z","3.0.4":"2018-05-13T12:10:39.341Z","3.0.5":"2018-07-03T14:59:32.720Z","3.0.6":"2020-06-06T12:59:56.574Z"},"maintainers":[{"name":"jimmylaurent","email":"jimlaurent0@gmail.com"}],"description":"Scraper next gen based on x-ray (2.3.2)","homepage":"https://github.com/JimmyLaurent/x-ray-scraper#readme","keywords":["api","cheerio","scrape","scraper","structure","web"],"repository":{"type":"git","url":"git://github.com/JimmyLaurent/x-ray-scraper.git"},"author":{"name":"Jimmy Laurent"},"bugs":{"url":"https://github.com/JimmyLaurent/x-ray-scraper/issues"},"license":"MIT","readme":"<h1 align=\"center\">x-ray-scraper</h1>\n\n<h5 align=\"center\">Scraper next gen based on x-ray (2.3.2)</h5>\n\n## Why a fork\n\nI wanted to use x-ray in a react-native projet but when I looked to the code I thought that a first refactoring was necessary.\nI took some liberties along the way and made some changes to the original api, it's why I created a new package called \"x-ray-scraper\".\n\nMain differences with the original x-ray:\n - instatiation of x-ray is different,\n - all the callbacks were replaced with promises (except for the crawler),\n - javascript up to date (use of es6+ features),\n - \"x-ray-crawler\" and \"x-ray-parse\" npm module are now included as a part of the project,\n - mocha was replaced with jest.\n\nIt's not yet compatible with react-native but could be in the near future.\n\n```js\nconst x = require('x-ray-scraper');\n\nx('https://blog.ycombinator.com/', '.post', [{\n  title: 'h1 a',\n  link: '.article-title@href'\n}])\n  .paginate('.nav-previous a@href')\n  .limit(3)\n  .write('results.json')\n```  \n\n## Installation\n\n```\nnpm install x-ray-scraper\n```\n\n## Features\n\n- **Flexible schema:** Supports strings, arrays, arrays of objects, and nested object structures. The schema is not tied to the structure of the page you're scraping, allowing you to pull the data in the structure of your choosing.\n\n- **Composable:** The API is entirely composable, giving you great flexibility in how you scrape each page.\n\n- **Pagination support:** Paginate through websites, scraping each page. X-ray also supports a request `delay` and a pagination `limit`. Scraped pages can be streamed to a file, so if there's an error on one page, you won't lose what you've already scraped.\n\n- **Crawler support:** Start on one page and move to the next easily. The flow is predictable, following\na breadth-first crawl through each of the pages.\n\n- **Responsible:** X-ray has support for concurrency, throttles, delays, timeouts and limits to help you scrape any page responsibly.\n\n- **Pluggable drivers:** Swap in different scrapers depending on your needs.\n\n## Selector API\n\n### xray(url, selector)\n\nScrape the `url` for the following `selector`, returning an object via a promise.\nThe `selector` takes an enhanced jQuery-like string that is also able to select on attributes. The syntax for selecting on attributes is `selector@attribute`. If you do not supply an attribute, the default is selecting the `innerText`.\n\nHere are a few examples:\n\n- Scrape a single tag\n\n```js\nx('http://google.com', 'title')\n  .then(title) {\n    console.log(title); // Google\n  })\n\nOR\n\nconst title = await x('http://google.com', 'title');\nconsole.log(title);\n\n```\n\n- Scrape a single class\n\n```js\nx('http://reddit.com', '.content')\n  .then(console.log)\n  .catch(console.error)\n```\n\n- Scrape an attribute\n\n```js\nx('http://techcrunch.com', 'img.logo@src')\n  .then(console.log)\n  .catch(console.error)\n```\n\n- Scrape `innerHTML`\n\n```js\nx('http://news.ycombinator.com', 'body@html')\n  .then(console.log)\n  .catch(console.error)\n```\n\n### xray(url, scope, selector)\n\nYou can also supply a `scope` to each `selector`. In jQuery, this would look something like this: `$(scope).find(selector)`.\n\n### xray(html, scope, selector)\n\nInstead of a url, you can also supply raw HTML and all the same semantics apply.\n\n```js\nconst html = \"<body><h2>Pear</h2></body>\";\nx(html, 'body', 'h2')\n  .then(header => console.log(header))\n  .catch(console.error)\n```\n\n## API\n\n### xray.driver(driver)\n\nSpecify a `driver` to make requests through. Available drivers include:\n\n- [request](https://github.com/Crazometer/request-x-ray) - A simple driver built around request. Use this to set headers, cookies or http methods.\n- [phantom](https://github.com/lapwinglabs/x-ray-phantom) - A high-level browser automation library. Use this to render pages or when elements need to be interacted with, or when elements are created dynamically using javascript (e.g.: Ajax-calls).\n\n### xray.stream()\n\nReturns Readable Stream of the data. This makes it easy to build APIs around x-ray. Here's an example with Express:\n\n```js\nconst app = require('express')();\nconst x = require('x-ray-scraper')();\n\napp.get('/', (req, res) => {\n  const stream = x('http://google.com', 'title').stream();\n  stream.pipe(res);\n})\n```\n\n### xray.write([path])\n\nStream the results to a `path`.\n\nIf no path is provided, then the behavior is the same as [.stream()](#xraystream).\n\n### xray.then(cb)\n\nConstructs a `Promise` object and invoke its `then` function with a callback `cb`. Be sure to invoke `then()` at the last step of xray method chaining.\n\n```js\nx('https://dribbble.com', 'li.group', [{\n  title: '.dribbble-img strong',\n  image: '.dribbble-img [data-src]@data-src',\n}])\n  .paginate('.next_page@href')\n  .limit(3)\n  .then(res => {\n    console.log(res[0]) // prints first result\n  })\n  .catch(err => {\n    console.log(err) // handle error in promise\n  })\n```\n\n### xray.paginate(selector)\n\nSelect a `url` from a `selector` and visit that page.\n\nAlso accept a function as argument.\nThe `selector` function receives two arguments:\n\n- `pageNumber`: The next page number (first call with value 2)\n- `$`: Cheerio object if you want to select stuffs to compute the next url.\n\n```js\n  x('https://blog.ycombinator.com/', '.post', [\n    {\n      title: 'h1 a',\n      link: '.article-title@href'\n    }\n  ])\n  .paginate((pageNumber, $) => `https://blog.ycombinator.com/page/${pageNumber}/`)\n  .limit(3);\n  .then(res => {\n    console.log(res[0]) // prints first result\n  })\n  .catch(err => {\n    console.log(err) // handle error in promise\n  })\n```\n\n### xray.limit(n)\n\nLimit the amount of pagination to `n` requests.\n\n### xray.abort(validator)\n\nAbort pagination if `validator` function returns `true`.\nThe `validator` function receives two arguments:\n\n- `result`: The scrape result object for the current page.\n- `nextUrl`: The URL of the next page to scrape.\n\n### xray.delay(from, [to])\n\nDelay the next request between `from` and `to` milliseconds.\nIf only `from` is specified, delay exactly `from` milliseconds.\n\n### xray.concurrency(n)\n\nSet the request concurrency to `n`. Defaults to `Infinity`.\n\n### xray.throttle(n, ms)\n\nThrottle the requests to `n` requests per `ms` milliseconds.\n\n### xray.timeout (ms)\n\nSpecify a timeout of `ms` milliseconds for each request.\n\n## Collections\n\nX-ray also has support for selecting collections of tags. While `x('ul', 'li')` will only select the first list item in an unordered list, `x('ul', ['li'])` will select all of them.\n\nAdditionally, X-ray supports \"collections of collections\" allowing you to smartly select all list items in all lists with a command like this: `x(['ul'], ['li'])`.\n\n## Composition\n\nX-ray becomes more powerful when you start composing instances together. Here are a few possibilities:\n\n### Crawling to another site\n\n```js\nconst x = require('x-ray-scraper');\n\nx('http://google.com', {\n  main: 'title',\n  image: x('#gbar a@href', 'title'), // follow link to google images\n})\n.then(obj => {\n/*\n  {\n    main: 'Google',\n    image: 'Google Images'\n  }\n*/\n});\n```\n\n### Scoping a selection\n\n```js\nconst x = require('x-ray-scraper');\n\nx('http://mat.io', {\n  title: 'title',\n  items: x('.item', [{\n    title: '.item-content h2',\n    description: '.item-content section'\n  }])\n)\n.then(obj => {\n/*\n  {\n    title: 'mat.io',\n    items: [\n      {\n        title: 'The 100 Best Children\\'s Books of All Time',\n        description: 'Relive your childhood with TIME\\'s list...'\n      }\n    ]\n  }\n*/\n})\n```\n\n### Filters\n\nFilters can be specified with setFilters method. To apply filters to a value, append them to the selector using `|`.\n\n```js\nconst x = require('x-ray-scraper');\n\nx.setFilters({\n    trim: function (value) {\n      return typeof value === 'string' ? value.trim() : value\n    },\n    reverse: function (value) {\n      return typeof value === 'string' ? value.split('').reverse().join('') : value\n    },\n    slice: function (value, start , end) {\n      return typeof value === 'string' ? value.slice(start, end) : value\n    }\n});\n\nx('http://mat.io', {\n  title: 'title | trim | reverse | slice:2,3'\n})\n.then(obj => {\n/*\n  {\n    title: 'oi'\n  }\n*/\n})\n```\n\n### Create multiple instances\n\nSometimes, you may need to instantiate multiple instances of xray.\n\n```js\nconst Xray = require('x-ray-scraper/Xray');\nconst xOne = Xray();\n\n// Optionnal parameter: driver\nconst xTwo = Xray(/* driver */);\n\nxOne('http://reddit.com', '.content')\n  .then(console.log)\n  .catch(console.error);\n\nxTwo('http://reddit.com', '.content')\n  .then(console.log)\n  .catch(console.error);\n\n```\n\n\n## Examples\n\n- [selector](/examples/selector/index.js): simple string selector\n- [collections](/examples/collections/index.js): selects an object\n- [arrays](/examples/arrays/index.js): selects an array\n- [collections of collections](/examples/collection-of-collections/index.js): selects an array of objects\n- [array of arrays](/examples/array-of-arrays/index.js): selects an array of arrays\n\n\n## Credits\n\n- Big thanks to [Matthew Mueller](https://github.com/matthewmueller) and all the contibutors of the original [module](https://github.com/matthewmueller/x-ray).\n\n## License\n\nMIT\n","readmeFilename":"README.md"}