欢迎光临UUpython
最大、最新、最全的Python代码收集站

爬取日本新闻网站文章发表到wordpress

这段代码是一个Python脚本,用于从 NHK 新闻网站提取文章信息并将其发布到 WordPress 网站。下面是对代码的逐步解释:

  1. 导入所需的库和模块:

这部分导入了需要的第三方库和模块,用于HTTP请求、HTML解析、日期处理以及与WordPress进行交互。

  1. 定义NHK新闻站点和API地址:

定义了NHK新闻站点的根URL host,以及获取新闻文章的API地址 url

  1. 设置HTTP请求头:

定义HTTP请求的头部信息,模拟浏览器请求,避免被服务器识别为爬虫。

  1. 发送HTTP GET请求,获取NHK新闻文章的JSON内容:

发送GET请求,如果响应状态码为200,则解析JSON响应内容,否则打印失败信息。

  1. 设置WordPress站点相关信息:

定义WordPress站点的XML-RPC接口地址、用户名和密码。

  1. 定义NHK新闻分类相关数据:

定义了NHK新闻分类和对应的WordPress分类信息。

  1. 解析NHK新闻文章JSON内容并进行处理:

如果响应状态码为200,那么开始遍历JSON内容中的每篇文章,进行信息提取、分类创建、图片下载、日期转换等操作。

  1. 创建WordPress客户端对象:

根据WordPress站点信息和认证信息创建一个WordPress客户端对象。

  1. 获取标题、URL、图片路径等信息:

从每篇文章的JSON数据中提取标题、URL、图片路径和分类等信息。

  1. 创建分类实例:

根据从NHK提取的分类信息,创建WordPress分类实例。

  1. 检查分类是否存在:

检查特定分类是否在WordPress中已存在,如果不存在,则调用WordPress的创建分类方法。

  1. 获取正文内容:

通过文章链接获取正文内容,使用BeautifulSoup库进行HTML解析,提取正文文本。

  1. 下载图片:

使用HTTP请求从提取的图片路径下载图片,并将其上传到WordPress媒体库。

  1. 转换日期格式:

将NHK提供的日期字符串转换为WordPress所需的日期格式。

  1. 创建文章信息:

根据提取的各项信息,构建文章信息字典。

  1. 创建WordPress文章对象:

使用WordPressPost类创建文章对象,设置标题、内容、日期、分类、特色图像等信息。

  1. 发布文章:

通过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")
赞(0) 打赏
未经允许不得转载:UUpython » 爬取日本新闻网站文章发表到wordpress
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!