文章采集调用(下采集神器: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

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线