文章采集调用(下采集神器:chromedp+HeadlessChrome安装安装)
优采云 发布时间: 2022-02-14 22:03文章采集调用(下采集神器:chromedp+HeadlessChrome安装安装)
最近在采集微信文章的时候,遇到了一个比较棘手的问题。通过搜狗搜索的微信搜索模式,普通的直接爬取页面的方式无法绕过搜狗搜索的验证。于是使用gorequest成功采集到微信文章。
选择 chromedp + Headless Chrome
面对采集的目标没有达到的问题,我是不是该放弃了?显然不可能。你不是只有签名验证吗?只要不需要验证码,总有办法解决的(蒽,一般的验证码也可以解决)。于是牺牲了golang下的采集神器:chromedp。
简单来说,chromedp是golang语言用来调用Chrome调试协议来模拟浏览器行为,以简单的方式驱动浏览器的一个包。使用它只有一个简单的前提,那就是在你的电脑上安装 Chrome 浏览器。
Chrome浏览器的安装在Windows和macOS下没有问题,在桌面版Linux下也没有问题。但是在Linux服务器版上安装Chrome并不是那么简单,至少目前还没有可以直接在服务器上安装Chrome的包。
但是你要放弃你刚才的想法吗?当然这是不可能的。翻阅chromedp的文档,刚好找到一段:
最简单的方法是在 chromedp/headless-shell 映像中运行使用 chromedp 的 Go 程序。该图像收录无头外壳,一种较小的无头版本的 Chrome,chromedp 能够开箱即用地找到它。
他的意思是:最简单的方法是使用 chromedp 调用 chromedp/headless-shell 镜像。chromedp/headless-shell 是一个 docker 镜像,收录较小的 Chrome 无头浏览器。
好吧,既然是docker镜像,那就用docker来安装吧。
首先登录我们的linux服务器,下面的操作就是你已经登录了linux服务器了。
安装 docker 并安装 chromedp/headless-shell
如果您的服务器已经安装了 docker,请跳过此步骤。
用 yum 安装 docker
yum install docker
安装完成后,此时无法直接使用docker,需要执行以下命令激活
systemctl daemon-reload
service docker restart
然后安装 chromedp/headless-shell 镜像
docker pull chromedp/headless-shell:latest
等待安装完成,然后运行docker镜像
docker run -d -p 9222:9222 --rm --name headless-shell chromedp/headless-shell
运行后测试chrome是否正常:
curl http://127.0.0.1:9222/json/version
如果您看到类似以下内容,则 chrome 浏览器工作正常
{ “浏览器”:“Chrome/96.0.4664.110”,“协议版本”:“1.3”,“用户代理”:“ Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, 像 Gecko) Chrome/96.0.4664.110 Safari/537.36", "V8-版本": "9.6.180.21", "WebKit-版本": "537.36 (@d5ef0e8214bc14c9b5bbf69a1515e431394c62a6)", "webSocketDebuggerUrl": "ws://127.0.0.1:9222/devtools/browser/a41cd42b-99ef -4d5b-b9e6-37d634aa719a" }
chromedp代码调用chromedp/headless-shell的内容采集微信公众号文章
以上已经可以在linux下正常使用Headless Chrome无头浏览器了。剩下的就是调用它的代码。
下面开始编写采集WeChat文章使用的chrome代码:
定义关键字,artile struct.go
package main
type Keyword struct {
Id int64 `json:"id"`
Name string `json:"name"`
Level int `json:"level"`
ArticleCount int `json:"article_count"`
LastTime int64 `json:"last_time"` //上次执行时间
}
type Article struct {
Id int64 `json:"id"`
KeywordId int64 `json:"keyword_id"`
Title string `json:"title"`
Keywords string `json:"keywords"`
Description string `json:"description"`
OriginUrl string `json:"origin_url"`
Status int `json:"status"`
CreatedTime int `json:"created_time"`
UpdatedTime int `json:"updated_time"`
Content string `json:"content"`
ContentText string `json:"-"`
}
编写核心代码core.go
<p>package main
import (
"context"
"fmt"
"github.com/chromedp/cdproto/cdp"
"github.com/chromedp/chromedp"
"log"
"net"
"net/url"
"strings"
"time"
)
func CollectArticleFromWeixin(keyword *Keyword) []*Article {
timeCtx, cancel := context.WithTimeout(GetChromeCtx(false), 30*time.Second)
defer cancel()
var collectLink string
err := chromedp.Run(timeCtx,
chromedp.Navigate(fmt.Sprintf("https://weixin.sogou.com/weixin?p=01030402&query=%s&type=2&ie=utf8", keyword.Name)),
chromedp.WaitVisible(`//ul[@class="news-list"]`),
chromedp.Location(&collectLink),
)
if err != nil {
log.Println("读取搜狗搜索列表失败1:", keyword.Name, err.Error())
return nil
}
log.Println("正在采集列表:", collectLink)
var aLinks []*cdp.Node
if err := chromedp.Run(timeCtx, chromedp.Nodes(`//ul[@class="news-list"]//h3//a`, &aLinks)); err != nil {
log.Println("读取搜狗搜索列表失败2:", keyword.Name, err.Error())
return nil
}
var articles []*Article
for i := 0; i