我正试图从纽约时报中抓取完整的书评,以便对它们进行情绪分析。我知道 NY Times API并使用它来获取书评 URL,但我需要设计一个抓取工具来获取完整的文章文本,因为 API 只提供了一个片段。我相信 nytimes.com 具有机器人保护功能以防止机器人抓取该网站,但我知道有一些方法可以规避它。
我找到了这个 python scraper它可以工作并且可以从 nytimes.com 中提取全文,但我更愿意在 Go 中实现我的解决方案。我应该把它移植到 Go 还是这个解决方案不必要地复杂?我已经尝试过更改 User-Agent header ,但我在 Go 中所做的一切都以无限重定向循环错误结束。
代码:
package main
import (
//"fmt"
"io/ioutil"
"log"
"math/rand"
"net/http"
"time"
//"net/url"
)
func main() {
rand.Seed(time.Now().Unix())
userAgents := [5]string{
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0",
"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0",
}
url := "http://www.nytimes.com/2015/10/25/books/review/the-tsar-of-love-and-techno-by-anthony-marra.html"
client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatalln(err)
}
req.Header.Set("User-Agent", userAgents[rand.Intn(len(userAgents))])
resp, err := client.Do(req)
if err != nil {
log.Fatalln(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalln(err)
}
log.Println(string(body))
}
结果:
2016/12/05 21:57:53 Get http://www.nytimes.com/2015/10/25/books/review/the-tsar-of-love-and-techno-by-anthony-marra.html?_r=4: stopped after 10 redirects
exit status 1
感谢任何帮助!谢谢!
最佳答案
您只需将 cookie 添加到您的客户端:
var cookieJar, _ = cookiejar.New(nil)
var client = &http.Client{Jar: cookieJar}
resp, err := client.Do(req)
if err != nil {
log.Fatalln(err)
}
// now response contains all you need and
// you can show it on the console or save to file
关于web - 在抓取完整的纽约时报文章时如何规避机器人保护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40980712/