Twitter 爬虫
Twitter 的 API 使用起来很烦人,而且有很多限制—— 幸运的是,他们的前端(JavaScript)有自己的 API,我对其进行了逆向工程。 没有 API 速率限制。不需要令牌。没有限制。速度极快。
您可以使用这个库轻松获取任何用户的推文内容。
安装
go get -u github.com/n0madic/twitter-scraper
使用方法
认证
现在所有方法都需要认证!
登录
err := scraper.Login("用户名", "密码")
使用用户名登录,而不是电子邮件! 但如果您有邮箱确认,请额外使用电子邮件地址:
err := scraper.Login("用户名", "密码", "电子邮件")
如果您启用了两步验证,请使用验证码:
err := scraper.Login("用户名", "密码", "验证码")
可以通过以下方式检查登录状态:
scraper.IsLoggedIn()
注销(清除会话):
scraper.Logout()
如果您想在重启之间保存会话,可以使用 scraper.GetCookies()
保存 cookies,并使用 scraper.SetCookies()
恢复。
例如,保存 cookies:
cookies := scraper.GetCookies()
// 序列化为 JSON
js, _ := json.Marshal(cookies)
// 保存到文件
f, _ = os.Create("cookies.json")
f.Write(js)
加载 cookies:
f, _ := os.Open("cookies.json")
// 从 JSON 反序列化
var cookies []*http.Cookie
json.NewDecoder(f).Decode(&cookies)
// 加载 cookies
scraper.SetCookies(cookies)
// 检查登录状态
scraper.IsLoggedIn()
开放账户
如果您不想使用自己的账户,可以尝试以 Twitter 应用程序身份登录:
err := scraper.LoginOpenAccount()
获取用户推文
package main
import (
"context"
"fmt"
twitterscraper "github.com/n0madic/twitter-scraper"
)
func main() {
scraper := twitterscraper.New()
err := scraper.LoginOpenAccount()
if err != nil {
panic(err)
}
for tweet := range scraper.GetTweets(context.Background(), "Twitter", 50) {
if tweet.Error != nil {
panic(tweet.Error)
}
fmt.Println(tweet.Text)
}
}
看起来您最多可以请求 50 条推文。
获取单条推文
package main
import (
"fmt"
twitterscraper "github.com/n0madic/twitter-scraper"
)
func main() {
scraper := twitterscraper.New()
err := scraper.Login(username, password)
if err != nil {
panic(err)
}
tweet, err := scraper.GetTweet("1328684389388185600")
if err != nil {
panic(err)
}
fmt.Println(tweet.Text)
}
使用标准运算符搜索推文
现在搜索功能仅适用于已认证用户!
包含 "twitter"、"scraper" 和 "data",并过滤掉转发的推文:
package main
import (
"context"
"fmt"
twitterscraper "github.com/n0madic/twitter-scraper"
)
func main() {
scraper := twitterscraper.New()
err := scraper.Login(username, password)
if err != nil {
panic(err)
}
for tweet := range scraper.SearchTweets(context.Background(),
"twitter scraper data -filter:retweets", 50) {
if tweet.Error != nil {
panic(tweet.Error)
}
fmt.Println(tweet.Text)
}
}
搜索在获取 50 条推文后结束。
查看规则和过滤以构建标准查询。
设置搜索模式
scraper.SetSearchMode(twitterscraper.SearchLatest)
选项:
twitterscraper.SearchTop
- 默认模式twitterscraper.SearchLatest
- 实时模式twitterscraper.SearchPhotos
- 图片模式twitterscraper.SearchVideos
- 视频模式twitterscraper.SearchUsers
- 用户模式
获取个人资料
package main
import (
"fmt"
twitterscraper "github.com/n0madic/twitter-scraper"
)
func main() {
scraper := twitterscraper.New()
scraper.LoginOpenAccount()
profile, err := scraper.GetProfile("Twitter")
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", profile)
}
按查询搜索个人资料
package main
import (
"context"
"fmt"
twitterscraper "github.com/n0madic/twitter-scraper"
)
func main() {
scraper := twitterscraper.New().SetSearchMode(twitterscraper.SearchUsers)
err := scraper.Login(username, password)
if err != nil {
panic(err)
}
for profile := range scraper.SearchProfiles(context.Background(), "Twitter", 50) {
if profile.Error != nil {
panic(profile.Error)
}
fmt.Println(profile.Name)
}
}
获取趋势
package main
import (
"fmt"
twitterscraper "github.com/n0madic/twitter-scraper"
)
func main() {
scraper := twitterscraper.New()
trends, err := scraper.GetTrends()
if err != nil {
panic(err)
}
fmt.Println(trends)
}
使用代理
支持 HTTP(s) 和 SOCKS5 代理
使用 HTTP
err := scraper.SetProxy("http://localhost:3128")
if err != nil {
panic(err)
}
使用 SOCKS5
err := scraper.SetProxy("socks5://localhost:1080")
if err != nil {
panic(err)
}
延迟请求
在 API 请求之间添加延迟(以秒为单位)
scraper.WithDelay(5)
加载包含回复的时间线
scraper.WithReplies(true)