事实:WordPress 网站纯代码实现“历史上的今天”文章调用方法
优采云 发布时间: 2022-10-31 05:46事实:WordPress 网站纯代码实现“历史上的今天”文章调用方法
网站创建一年多了,文章有500多篇文章,如何创造历史文章多次展示的机会,除了相关文章推荐外,站长经常使用“历史上的今天”功能,即在文章结束时调用往年同一天发布的文章列表。
这个功能最初是由柳成创建的wp-today插件实现的,现在已经停产多年了,它的核心代码并不复杂,我们可以将代码复制到WordPress网站主题的函数.php文件中。
历史上的今天,代码来自柳城博客的WP-Today插件
函数 wp_today(){
全球$wpdb;
$post_年 = get_the_time('Y');
$post_month = get_the_time('m');
$post_day = get_the_time('j');
$sql =“选择 ID、年份 (post_date_gmt) 作为 h_year、post_title comment_count FROM
$wpdb->帖子,其中post_password='',post_type='发布',post_status='发布'AND year(post_date_gmt)!='$post_year' AND month(post_date_gmt)='$post_
month' AND day(post_date_gmt)='$post_day'
按post_date_gmt DESC 限制订购 5“;
$histtory_post = $wpdb->get_results($sql);
if( $histtory_post ){
foreach( $histtory_post as $post ){
$h_年 = $post->h_year;
$h_post_title = $post->post_title;
$h_permalink = get_permalink( $post->ID );
$h_评论 = $post->comment_count;
$h_post .= “$h_year:$h_post_title($h_comments)”;
}
}
if ( $h_post ){
$result =“历史上的今天:”;
}
返回$result;
}
函数 wp_today_auto($content){
if( is_single() ){
$content = $content.wp_today();
}
返回$content;
}
add_filter(“the_content”,“wp_today_auto”,9999);
达到的效果如下图所示
“历史上的今天”模块会调用历史同一天文章列表,显示年份、文章标题、链接和评论数量,您的网站构建时间越长,它就越有价值。
这
Autumn Pro主题网站前几天升级,功能文件函数中添加的代码.php更新后被清空,让我对主题更新又爱又恨。我发现之前的唤醒方法很好,他开发的主题会在functions.php中引用一个子函数文件,用户自己添加的代码写在这个文件中,这样主题升级时就不会清除主题。
目前,我的主题函数中有三个自添加代码,另外两个是:
历史上的今天:
干货内容:通过关键词获取微博内容
通过关键词获取微博内容
背景
最近,部门同事发现,在研究过程中需要进行舆论监测。研究团队报告称,新浪微博上积累了大量舆论内容,均由用户发布。其实我在等网友。如果你在博客或者朋友圈发帖,抱怨一个人夸另一个人,可能一个人的意见不足以构成洪流,那么一大群人的意见就会产生很强的聚合效应. 想要研究舆情,首先要有舆情内容,然后再利用自然语言处理技术进行进一步的舆情挖掘,如何获取舆情内容,新浪微博给出了两个解决方案
使用微博API,优点是调用方便,返回的数据结构一目了然,缺点是限制太严重。
先手动登录,把新浪微博cookie和http请求一起放到浏览器中发送,就可以得到你想要的页面了。缺点是cookie有过期时间,一天可能需要更换几次。
实践证明第一种方式不行,我申请了开发者认证好几次了,都不会给我发认证邮件,而且开发者文档是2012年写的,一直没有更新,所以改用了第二种方案- 爬行。
创意设计
本研究的主要目的是采集集中式公寓前10品牌的舆情数据。通过输入品牌 关键词,然后在 关键词 字段下抓取博主、博客内容和博客时间。例如我在 url
在搜索栏中输入“公园公寓”关键词
会有好几条关于港口公寓的微博,内容就在眼前。下一步就是抓取这些微博,并存入数据库。
完整代码
# -*- coding: utf-8 -*-
"""
project_name:sina
@author: 帅帅de三叔
Created on Thu Aug 8 15:38:23 2019
"""
import requests #导入网页请求模块
from bs4 import BeautifulSoup #导入网页解析模块
import urllib.parse #url中文编码
import time #导入时间模块
import pymysql #导入数据库模块
header={"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
<p>
"Connection": "keep-alive",
"Cookie": "SINAGLOBAL=189893257055.06488.1565250256566; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WhIslrza.kd.kNEJcd42Uiz5JpX5KMhUgL.Fo2NSK2Xeh-RS022dJLoIpXLxKqLBo-L1h2LxKqLBo-LB-8.9CH8SC-RSEHWeBtt; UOR=,,login.sina.com.cn; webim_unReadCount=%7B%22time%22%3A1565594400683%2C%22dm_pub_total%22%3A0%2C%22chat_group_client%22%3A166%2C%22allcountNum%22%3A182%2C%22msgbox%22%3A0%7D; ALF=1597195209; SSOLoginState=1565659210; SCF=AvgIv74Ms33G2ftEbwjdl6H0E-HCYkHVFewxNE8Kd7QU4g3AjjXO0yp9JQGZkYk9Zi-NqteyTja21CeazpUGQcc.; SUB=_2A25wVmAaDeRhGedJ7lMV8CvEzD2IHXVTItbSrDV8PUNbmtBeLUL6kW9NUeEu3p4s_PkH8hhC31wYMQ5PSb-t_qZq; SUHB=0BLpscTreRdnfr; _s_tentry=login.sina.com.cn; Apache=4077173518697.288.1565659211864; ULV=1565659211929:4:4:2:4077173518697.288.1565659211864:1565572651396; WBStorage=edfd723f2928ec64|undefined",
"Host": "s.weibo.com",
"Referer": "https://s.weibo.com/weibo?q=%E6%B3%8A%E5%AF%93&wvr=6&Refer=SWeibo_box",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "same-origin",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"}
db=pymysql.connect("localhost","root","123456","weibo",charset="utf8mb4") #链接数据库
cursor=db.cursor() #获取游标
cursor.execute("DROP TABLE IF EXISTS weibo_anxingongyu") #重头再来
c_sql="""create table weibo_anxingongyu(
author varchar(12),
content varchar(300),
time varchar(30)
)Engine=InnoDB AUTO_INCREMENT=1 Default charset=utf8mb4""" #创建表采用utf8mb4可以把emoji插入数据库
cursor.execute(c_sql) #执行创建表
def get_page(keywords,num):#构造请求网址
original_url="https://s.weibo.com/weibo?q={}&Refer=SWeibo_box&page={}"
for page in range(1,num+1):
url=original_url.format(keywords,page)
yield url
def get_content(get_page): #定义获取微博内容函数
time.sleep(1) #挂起进程一秒
response=requests.get(get_page,headers=header,timeout=10) #带cookies请求
soup=BeautifulSoup(response.text,'lxml') #解析网页
#print(soup)
contents=soup.find("div",class_="m-con-l",id="pl_feedlist_index").findAll("div",class_="card-feed") #微博内容
#print(contents[-1])
for content in contents:
author=content.find("a",class_="name").get_text() #发文者
comment=content.find("p",class_="txt").get_text().strip().replace("展开全文c","") #微博内容片段
#full_comment=content.find_element_by_xpath("//a[@node-type='feed_list_content_full") #完整内容
date_time=content.find("p",class_="from").find("a").get_text().strip() #发博日期
print(author,comment,date_time)
insert_data=("insert into weibo_anxingongyu(author,content,time)""values(%s,%s,%s)") #控制插入格式
weibo_data=([author,comment,date_time]) #待插入数据
cursor.execute(insert_data,weibo_data) #执行数据
db.commit()#主动提交数据库
if __name__=="__main__":
keyword=urllib.parse.quote(input("please input keywords:")) #输入关键词并编码
num=int(input("please input total pages:")) #请输入爬取总页数并转为整数型
for link in get_page(keyword,num):
get_content(link)
</p>
截屏
代码分析
爬取微博的关键是登录一次就能记住cookies,然后用它们来构造请求头。请及时更新请求头。首先**get_page()**函数接受两个参数关键词keyword和pageCount num来构造所有请求的网页,然后进入第二步使用get_content()函数获取需要的字段,最后将它们存储在数据库mysql中。如果将它们存储在数据库中,请注意 emoji 表情符号的大小。您可以使用 utf8mb4 将表情符号插入数据库。
如果要复制这段代码获取,记得每次登录一次,F12查看源页面,更新请求头的header中的“Accept”、“Cookies”、“Referer”等关键字段,每次最多只能得到50页,不能再多了。