我正在尝试获取某些名人的 Instagram 用户名。我有这些名人的名字,从这些名字中,我想搜索Google并从搜索结果中获取用户名。我不想使用需要注册且有很多限制的Google或Instagram API。
因此,我只是在强求这些搜索(例如1000名名人)。获得名人用户名后,我将其保存在 Firebase
中这就是我的做法。
以下功能仅在Google中搜索名称+“官方instagram” ,并获得第一个结果和第一个标题。
private fun googleSearch(name: String): Observable<String> {
return Observable.fromCallable {
val strUrl = "https://www.google.com/search?q=$name+official+instagram"
val doc = Jsoup.connect(strUrl).get()
val table = doc!!.select("h3")
table.first().text()
}
}
下面是我正在为1000个用户运行的迭代。
disposable.add(Observable.just(users)
.subscribeOn(Schedulers.io())
.flatMap { users: MutableList<User> -> Observable.fromIterable(users) }
.flatMap( { user: User -> googleSearch(user.name))},
{user: User, username: String -> Pair(user, username)}
)
.observeOn(AndroidSchedulers.mainThread())
.subscribe{ pair ->
val username = pair.second
val user = pair.first
if (username.contains("Instagram photos")){
firebaseRootRef.child(user.id).child("instagramId").setValue(extractInstagUsername(username))
}
})
以下功能只是从搜索结果中获取确切的用户名。
private fun extractInstagUsername(title: String): String {
return StringUtils.substringBetween(title, "@", ")")
}
当我运行代码时,它可以为30-40个用户运行,但随后因错误而崩溃
E / NativeCrypto:AppData :: create pipe(2)失败:打开的文件太多
我所缺少的东西以及如何解决这个问题?