当你想使用 js

139 阅读2分钟

/ts 获取大量网络数据,不如来试试 x-crawl

x-crawl ·

x-crawl 是一个灵活的 Node.js 多功能爬虫库。灵活的使用方式和众多的功能可以帮助您快速、安全、稳定地爬取页面、接口以及文件。

如果你也喜欢 x-crawl ,可以在 GitHub 给 x-crawl 存储库 点个 star 支持一下,感谢大家的支持!

GitHub:github.com/coder-hxl/x…

特征

  • 🔥 异步同步 - 只需更改一下 mode 属性即可切换异步或同步爬取模式。
  • ⚙️ 多种用途 - 支持爬动态页面、静态页面、接口数据、文件以及轮询操作。
  • ⚒️ 控制页面 - 爬取动态页面支持自动化操作、键盘输入、事件操作等。
  • 🖋️ 写法灵活 - 同种爬取 API 适配多种配置,每种配置方式都非常独特。
  • ⏱️ 间隔爬取 - 无间隔、固定间隔以及随机间隔,产生或避免高并发爬取。
  • 🔄 失败重试 - 避免因短暂的问题而造成爬取失败,自定义重试次数。
  • ➡️ 轮换代理 - 配合失败重试,自定义错误次数以及 HTTP 状态码自动轮换代理。
  • 👀 设备指纹 - 零配置或自定义配置,避免指纹识别从不同位置识别并跟踪我们。
  • 🚀 优先队列 - 根据单个爬取目标的优先级可以优先于其他目标提前爬取。
  • 🧾 爬取记录 - 对爬取进行记录,并在终端使用彩色字符串提醒。
  • 🦾 TypeScript - 拥有类型,通过泛型实现完整的类型。

示例

以每天自动获取世界各地的经历和房间的一些照片为例:

// 1.导入模块 ES/CJS
import xCrawl from 'x-crawl'




// 2.创建一个爬虫实例
const myXCrawl = xCrawl({ maxRetry: 3, intervalTime: { max: 2000, min: 1000 } })




// 3.设置爬取任务
// 调用 startPolling API 开始轮询功能,每隔一天会调用回调函数
myXCrawl.startPolling({ d: 1 }, async (count, stopPolling) => {
// 调用 crawlPage API 来爬取页面
const pageResults = await myXCrawl.crawlPage({
targets: [
'https://www.airbnb.cn/s/*/experiences',
'https://www.airbnb.cn/s/plus_homes'
],
viewport: { width: 1920, height: 1080 }
})



                            // 通过遍历爬取页面结果获取图片 URL
                              const imgUrls = []
                                for (const item of pageResults) {
                                    const { id } = item
                                        const { page } = item.data
                                            const elSelector = id === 1 ? '.i9cqrtb' : '.c4mnd7m'
                                            
                                                // 等待页面元素出现
                                                    await page.waitForSelector(elSelector)
                                                    
                                                        // 获取页面图片的 URL
                                                            const urls = await page.$$eval(`${elSelector} picture img`, (imgEls) =>
                                                                  imgEls.map((item) => item.src)
                                                                      )
                                                                          imgUrls.push(...urls.slice(0, 6))
                                                                          
                                                                              // 关闭页面
                                                                                  page.close()
                                                                                    }
                                                                                    
                                                                                      // 调用 crawlFile API 爬取图片
                                                                                        await myXCrawl.crawlFile({ targets: imgUrls, storeDirs: './upload' })
                                                                                        })</code></pre><p>运行效果:</p><p></p><p><strong>注意:</strong> 请勿随意爬取,爬取前可查看 <strong>robots.txt</strong> 协议。网站的类名可能会有变更,这里只是为了演示如何使用 x-crawl</p><h3 id="item-1-3">更多</h3><p>更多内容可查看:<a target="_blank" href="https://link.segmentfault.com/?enc=aZFvDSZJLgCKU3EjDcCc8w%3D%3D.xootVMm%2BQG3tXkBTqTbjgpQpGAVPZSJPF%2BIgNbHY%2F%2B%2BBCWI6WwmyYaBykhsaCM1N">https://github.com/coder-hxl/x-crawl</a></p>