初步想法:
1.抓取每日最新资讯,得到一个初步的文章列表及内容
2.利用AI工具重写去重,得到优化后的文章内容
3.通过自动化方法推送至公众号后台
4.审核修改后发送
重点在前3步,希望通过前3步减少前期内容准备工作,最后仅需确认即可发布。当然上面的方法仅适用于资讯类公众号,其他类型比如内容为王的公众号可能参考意义有限。
下面就开始吧!
首先第一步:抓取每日最新资讯
一、确定目标网站及爬虫规则
1.确定抓取的内容来源
1.1 主题是什么?
抓取的内容要与公众号主题切合
1.2 关键词是什么?
关键词是技术相关,比如:前端、后端、AI、互联网行业动态等。
1.3 网站是什么?
抓取的网站合法是前提!
爬取网站内容需要遵守相关法律和规定,并尊重网站的隐私政策和服务条款。在进行爬取之前,建议先查看网站的 robots.txt 文件,以了解网站是否允许爬取,并遵守网站的爬取规则。
2.确定爬虫规则
示例一:IT之家:https://www.ithome.com/
(1)首先我们打开网站,打开控制台,刷新一下网页,可以看到网站采用的是服务端渲染(SSR:Server-Side Rendering)的方式
(2)接着我们查看一下网站的robots.txt文件,以了解网站是否允许爬取以及网站的爬取规则
在浏览器中输入 "https://www.ithome.com/robots.txt" 并访问该 URL
可以看到 /ithome、/keywords/、/search/、/comment/、/*?*(不允许爬虫访问带有问号(?)的URL)、/?*(不允许爬虫访问根路径下带有问号(?)的URL)、/html/zixun这些路径禁止爬取
(3)点击网页发现/list路径不在robots.txt禁止路径内,符合爬虫规则。最终确定爬取的路径:https://www.ithome.com/list/和要爬取的内容:滚动新闻部分
二、爬取数据
技术栈:python
1.爬取文章类型及标题
python简单入门,可以参考下这篇博文:https://blog.csdn.net/bookssea/article/details/107309591
参照上面博文,稍微修改下代码,我们可以得到滚动新闻区域的 新闻类型、文章标题和时间excel表格。
代码如下:
# -*- codeing = utf-8 -*-
from bs4 import BeautifulSoup # 网页解析,获取数据
import re # 正则表达式,进行文字匹配`
import urllib.request, urllib.error # 制定URL,获取网页数据
import xlwt # 进行excel操作
findType = re.compile(r'\[(.*?)\]')
findTitle = re.compile(r'<a class="t".*target="_blank">(.*?)</a>', re.S)
findTime = re.compile(r'<i>(.*?)</i>')
def main():
baseurl = "https://www.ithome.com/list/" #要爬取的网页链接
# 1.爬取网页
datalist = getData(baseurl)
savepath = "IT之家滚动新闻.xls" #当前目录新建XLS,存储进去
# 3.保存数据
saveData(datalist,savepath)
# 爬取网页
def getData(baseurl):
datalist = [] #用来存储爬取的网页信息
for i in range(0, 1): # 调用获取页面信息的函数,1次
html = askURL(baseurl) # 保存获取到的网页源码
# 2.逐一解析数据
soup = BeautifulSoup(html, "html.parser")
datel_ul = soup.find("ul", class_="datel")
for item in datel_ul.find_all("li"): # 查找符合要求的字符串
data = [] # 保存所有信息
item = str(item)
type = re.findall(findType, item)[0] # 通过正则表达式查找
data.append(type)
title = re.findall(findTitle, item)[0]
data.append(title)
time = re.findall(findTime, item)[0]
data.append(time)
datalist.append(data)
return datalist
# 得到指定一个URL的网页内容
def askURL(url):
head = { # 模拟浏览器头部信息,向服务器发送消息
"User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36"
}
# 用户代理,表示告诉服务器,我们是什么类型的机器、浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)
request = urllib.request.Request(url, headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
return html
# 保存数据到表格
def saveData(datalist,savepath):
book = xlwt.Workbook(encoding="utf-8",style_compression=0) #创建workbook对象
sheet = book.add_sheet('IT之家滚动新闻', cell_overwrite_ok=True) #创建工作表
col = ("类型","文章标题","时间")
for i in range(0,3):
sheet.write(0,i,col[i]) #列名
for i in range(0,50):
data = datalist[i]
for j in range(0,3):
sheet.write(i+1,j,data[j]) #数据
book.save(savepath) #保存
if __name__ == "__main__": # 当程序执行时
# 调用函数
main()
目前只拿到了文章标题,这显然是不行的,我们还需要文章内容,并且单页数据有50条,并不是所有类型的文章都是我们所需要的,需要筛选出合适的文章。
2.获取文章详情
点击文章标题会跳转一个新的页面,新页面里包含了文章的内容详情,我们需要模拟用户的点击操作来获取文章详情,这里用selenium来模拟用户操作。
from selenium import webdriver
driver = webdriver.Edge()
# 获取详情数据
def getDetail(baseurl):
detailList = []
driver.get(baseurl)
for i in range(0,3):
element = driver.find_element(By.XPATH,f"//li[{i+1}]/a[@class='t']")
element.click()
# 获取打开的多个窗口句柄
windows = driver.window_handles
# 切换到当前最新打开的窗口
driver.switch_to.window(windows[-1])
selenium_page = driver.page_source
detailSoup = BeautifulSoup(selenium_page, 'html.parser')
content = detailSoup.find("div", class_="post_content")
detailList.append(content.get_text())
driver.close()
driver.switch_to.window(windows[0])
driver.quit()
return detailList
拿到详情数据后可以将数据写入excel表格中,这样我们就得到了所有想要的数据。表格内容如下:
3.筛选符合要求的数据
文章有很多类型(【游戏之家】、【IT资讯】、【智车之家】......),并不是所有类型的文章都是我们感兴趣的,这里我们只取类型是IT资讯、软件之家、科学探索、VR之家......的数据。
在获取类型时加一个筛选逻辑,修改类型的匹配规则,并且不符合类型的数据不加入数组中。
findType = re.compile(r'\[(IT资讯|软件之家|科学探索|VR之家|智能时代)\]')
def getData(baseurl):
datalist = [] #用来存储爬取的网页信息
for i in range(0, 1): # 调用获取页面信息的函数,1次
html = askURL(baseurl) # 保存获取到的网页源码
# 2.逐一解析数据
soup = BeautifulSoup(html, "html.parser")
datel_ul = soup.find("ul", class_="datel")
for item in datel_ul.find_all("li"): # 查找符合要求的字符串
data = [] # 保存所有信息
item = str(item)
type_result = re.findall(findType, item) # 通过正则表达式查找
if not type_result:
continue # 如果 type_result 为空,则跳过当前迭代,进入下一次循环
type = type_result[0]
data.append(type)
title = re.findall(findTitle, item)[0]
data.append(title)
time = re.findall(findTime, item)[0]
data.append(time)
href = re.findall(findHref, item)[0]
data.append(href)
datalist.append(data)
return datalist
同时在获取内容详情是也需要对应修改,只获取符合要求类型的内容详情。
// 将element的获取方式改为匹配详情链接
element = driver.find_element(By.XPATH,f'//a[@href="{datalist[i][3]}"]')
这样,我们就拿到符合要求的数据啦!
三、推送至公众号后台
1.获取access_token
调用上传至素材库接口前需先获取通用access_token,appid和secret可从微信公众号后台【设置与开发】-【基本配置】处获取,记得一定要把调用接口的IP地址加入白名单,并且等待10min后再本地调试,否则会报错40164拿不到access_token,代码如下:
import json
from urllib import parse, request
import time
## 此函数用于获取access_token,微信公众号开发文档:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
# // 获取token
def get_wxCode_token():
try:
appid = ""
secret = ""
textmod = {"grant_type": "client_credential",
"appid": appid,
"secret": secret
}
textmod = parse.urlencode(textmod)
header_dict = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'}
url = 'https://api.weixin.qq.com/cgi-bin/token'
req = request.Request(url='%s%s%s' % (url, '?', textmod), headers=header_dict)
res = request.urlopen(req)
res = res.read().decode(encoding='utf-8')
res = json.loads(res)
access_token = res["access_token"]
print('access_token:',(access_token,time.time()))
return (access_token,time.time())
except Exception as e:
print(e)
return False
if __name__ == '__main__':
# 获取access_token,公众号后台需 添加 你的ip地址 为白名单
get_wxCode_token()
2.上传至草稿箱
使用新建草稿接口,微信开发者文档:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Add_draft.html
由于thumb_media_id(图文消息的封面图片素材id)是新建草稿接口的必传项,我们需要先得到一个thumb_media_id,这里使用新增其他类型永久素材接口:
接口调试工具调用接口新增一个图片素材 ,返回值可以拿到我们需要的media_id
最后,调用新建草稿接口,就可以把我们拿到的数据推送到推送到公众号后台了 。
def add_draft(access_token, title, content):
url = 'https://api.weixin.qq.com/cgi-bin/draft/add?access_token={}'.format(access_token)
data = {
"articles": [
{
"title": title,
"content": content,
"thumb_media_id": ''
}
]}
headers = {'Content-Type': 'application/json'}
requests.post(url, data=json.dumps(data, ensure_ascii=False).encode('utf-8'), headers=headers)
大功告成!
总结
-
确定目标网站和公众号:确定你要爬取信息的目标网站和微信公众号。确保目标网站允许爬取并遵守相关的爬虫规则。
-
选择合适的编程语言和爬虫框架:选择一种适合你的编程语言,如Python,并选择一个方便的爬虫框架,如Scrapy或BeautifulSoup。
-
编写爬虫代码:使用选定的编程语言和爬虫框架编写代码。首先,通过发送HTTP请求获取目标网页的HTML内容。然后,使用HTML解析技术从HTML内容中提取出你感兴趣的信息,如标题、发布日期、链接等。
-
设计数据存储方案:确定如何存储爬取的信息。你可以选择将数据保存到本地文件、数据库或云存储等。
-
设置定时任务:使用定时任务工具,如crontab(Linux)或Windows任务计划程序(Windows),设置每天自动运行爬虫程序的时间。
-
处理反爬机制:一些网站可能会采取反爬机制,如验证码、IP封锁等。你可以使用代理IP池、设置请求头信息、延时请求等方法来绕过反爬机制。
-
监控和错误处理:设置适当的日志记录和错误处理机制,以便在爬虫运行过程中及时发现和处理错误,确保爬虫的稳定性和可靠性。
请注意,在实施爬虫之前,你应该确保你遵守相关的法律法规和网站的爬虫规定,以确保合法使用爬虫技术。此外,尊重网站的隐私政策和数据使用规定,避免过度爬取或滥用爬取到的信息。