web - 在抓取完整的纽约时报文章时如何规避机器人保护?

标签 web go web-scraping

我正试图从纽约时报中抓取完整的书评,以便对它们进行情绪分析。我知道 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/

相关文章:

javascript - 如何加密 HTML5 网络存储?

json - 为什么我的 Go 服务器不能正确解码从客户端发送的 JSON?

eclipse - 如何将外部包添加到 Google App Engine 的 GoClipse 项目?

python - 响应无法使用 Selenium 滚动更新

google-chrome - cookie 在服务器端还是在客户端/浏览器端过期?

javascript - 'http:url' 适用于所有浏览器和设备吗?

javascript - Google Analytics PageView 收集哪些数据?

json - Go websocket 序列化/反序列化 json

javascript - 网页抓取 : iterate through every page of web app using puppeteer

Python 请求 - "To continue your browser has to accept cookies and has to have JavaScript enabled."