这段代码是一个Python脚本,用于从 NHK 新闻网站提取文章信息并将其发布到 WordPress 网站。下面是对代码的逐步解释:
- 导入所需的库和模块:
这部分导入了需要的第三方库和模块,用于HTTP请求、HTML解析、日期处理以及与WordPress进行交互。
- 定义NHK新闻站点和API地址:
定义了NHK新闻站点的根URL host
,以及获取新闻文章的API地址 url
。
- 设置HTTP请求头:
定义HTTP请求的头部信息,模拟浏览器请求,避免被服务器识别为爬虫。
- 发送HTTP GET请求,获取NHK新闻文章的JSON内容:
发送GET请求,如果响应状态码为200,则解析JSON响应内容,否则打印失败信息。
- 设置WordPress站点相关信息:
定义WordPress站点的XML-RPC接口地址、用户名和密码。
- 定义NHK新闻分类相关数据:
定义了NHK新闻分类和对应的WordPress分类信息。
- 解析NHK新闻文章JSON内容并进行处理:
如果响应状态码为200,那么开始遍历JSON内容中的每篇文章,进行信息提取、分类创建、图片下载、日期转换等操作。
- 创建WordPress客户端对象:
根据WordPress站点信息和认证信息创建一个WordPress客户端对象。
- 获取标题、URL、图片路径等信息:
从每篇文章的JSON数据中提取标题、URL、图片路径和分类等信息。
- 创建分类实例:
根据从NHK提取的分类信息,创建WordPress分类实例。
- 检查分类是否存在:
检查特定分类是否在WordPress中已存在,如果不存在,则调用WordPress的创建分类方法。
- 获取正文内容:
通过文章链接获取正文内容,使用BeautifulSoup库进行HTML解析,提取正文文本。
- 下载图片:
使用HTTP请求从提取的图片路径下载图片,并将其上传到WordPress媒体库。
- 转换日期格式:
将NHK提供的日期字符串转换为WordPress所需的日期格式。
- 创建文章信息:
根据提取的各项信息,构建文章信息字典。
- 创建WordPress文章对象:
使用WordPressPost类创建文章对象,设置标题、内容、日期、分类、特色图像等信息。
- 发布文章:
通过WordPress的XML-RPC接口调用NewPost方法发布文章,处理异常情况。
以上是这段代码的主要逻辑。它从NHK新闻网站获取JSON格式的文章数据,然后根据提取的信息通过WordPress的XML-RPC接口发布这些文章。请注意,代码中包含了许多细节,需要确保提供的信息和路径正确,以及确保所需的库已正确安装。
import requests
from bs4 import BeautifulSoup
from datetime import datetime
from wordpress_xmlrpc import Client, WordPressPost, WordPressTerm
from wordpress_xmlrpc.methods.posts import NewPost
from wordpress_xmlrpc.methods.media import UploadFile
from wordpress_xmlrpc.methods.taxonomies import NewTerm, GetTerms
from wordpress_xmlrpc.exceptions import InvalidCredentialsError
# WordPress站点信息
host = 'https://www3.nhk.or.jp/news/'
url = "https://www3.nhk.or.jp/news/json16/new_001.json"
# url1 = "https://www3.nhk.or.jp/news/json16/cat04_001.json" # 政治
# url2 = "https://www3.nhk.or.jp/news/json16/cat01_001.json" # 社会
# url3 = "https://www3.nhk.or.jp/news/json16/cat06_001.json" # 国際
# url4 = "https://www3.nhk.or.jp/news/json16/cat08_001.json" # 天気
# url5 = "https://www3.nhk.or.jp/news/json16/cat07_001.json" # スポーツ
# url6 = "https://www3.nhk.or.jp/news/json16/cat05_001.json" # ビジネス
headers = {
'user-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
json_content = response.json()
print(json_content)
else:
print("Failed to retrieve JSON content")
xmlrpc = 'xmlrpc.php'
username = 'admin'
password = '123456'
host_url_arr = ['https://abc.com/']
category_arr = {
"1": "社会",
"2": "暮らし",
"3": "科学・文化",
"4": "政治",
"5": "ビジネス",
"6": "国際",
"7": "スポーツ",
"8": "天気",
}
category_slug = {
"1": "society",
"2": "life",
"3": "culture",
"4": "politics",
"5": "business",
"6": "international",
"7": "pe",
"8": "weather",
}
if response.status_code == 200:
json_content = response.json()
i = 0
for article in json_content["channel"]["item"]:
host_url = host_url_arr[i]
host_url = host_url + xmlrpc
wordpress_url = host_url + "index.php/wp-json/wp/v2/posts"
# 创建WordPress客户端对象
client = Client(host_url, username, password)
# 获取标题和URL
title = article["title"]
url = article["link"]
imgPath = article['imgPath']
cate = article['cate'] # 分类
category_name = category_arr[cate]
# 创建分类实例
category = WordPressTerm()
category.name = category_name # 设置分类名称
category.taxonomy = 'category' # 设置分类类型
category.slug = category_slug[cate] # 设置分类类型
# 检查'category'(分类)是否存在
terms = client.call(GetTerms('category', {'search': category_name}))
if terms:
print(f"{category.name} exists.")
else:
# 调用创建分类方法
category_id = client.call(NewTerm(category))
# 获取正文
new_url = host + url
content_response = requests.get(new_url)
content_response.encoding = 'utf-8'
content_soup = BeautifulSoup(content_response.content, "html.parser")
content = ""
article_body = content_soup.find("div", {"class": "content--detail-body"})
if article_body is None:
continue
for p in article_body.find_all("p"):
content += p.text.strip() + "\n"
new_img_path = host + imgPath
# 获取图片数据
response1 = requests.get(new_img_path)
response2 = client.call(UploadFile({
"name": "image.jpg", # 文件名称
"type": "image/jpeg", # 文件类型
"bits": response1.content, # 文件数据
}))
thumbnail_id = ''
# 检查响应状态码和内容
if response2:
thumbnail_id = response2['attachment_id']
print(f"文件已成功上传,URL:{response2['url']}")
else:
print("文件上传失败。")
# 获取发布日期
pub_date = article["pubDate"]
date_format = '%a, %d %b %Y %H:%M:%S %z'
# 将日期字符串转换为 datetime 对象
date_obj = datetime.strptime(pub_date, date_format)
# 将 datetime 对象转换为目标格式的日期字符串
new_date_format = '%Y-%m-%dT%H:%M:%S'
new_date_string = date_obj.strftime(new_date_format)
# 输出结果
print(title)
print(content)
print(pub_date)
print(url)
# 文章信息
post_data = {
"title": title,
"content": content,
"date": new_date_string,
"slug": article['id'],
"post_status": "publish", # 发布状态
"thumbnail": thumbnail_id, # 特色图像的媒体 ID
"terms_names": {"category": [category_name]} # 文章所属的分类名称数组
}
wp_post = WordPressPost()
wp_post.title = post_data["title"]
wp_post.content = post_data["content"]
wp_post.date = post_data["date"]
wp_post.slug = post_data["slug"]
wp_post.post_status = post_data.get("post_status", "publish")
wp_post.terms_names = post_data.get("terms_names", {})
wp_post.thumbnail = post_data.get("thumbnail", None)
# 发布文章
try:
post_id = client.call(NewPost(wp_post))
i += 1
if i > 11:
i = 0
print(f"文章'{wp_post.title}'发布成功,ID为{post_id}")
except InvalidCredentialsError:
print("WordPress用户名或密码错误")
except Exception as e:
print(f"发布文章'{wp_post.title}'失败,错误信息:{e}")
else:
print("Failed to retrieve JSON content")
评论前必须登录!
注册