公众号简单爬虫--把公众号文章全部转载到网站(三)
根据上一篇的方法,我们得到了一个包含标题,时间,作者,封面,文章连接等信息的json文件.接下来,就是要提取文章详细信息和把一系列的信息写入数据库.
这里先说明几点,我们转贴公众号文章,会有个问题,就是图片会不显示.由于网站源码是php的,所以我们要自己写一个 img.php文件放在网站根目录下,作用是让转贴的图片能显示出来.
代码如下:
<?php
header("Content-Type:image/gif");
$p=$_GET['p'];
$pics=file($p);
for($i=0;$i< count($pics);$i++)
{
echo $pics[$i];
}
?>
那么所有的图片都要修改,详细见下面代码.
再有就是封面图,网站没用提供外链功能,那么我们可以自己处理一下,把上面的img.php文件复制一份,拷贝到upload文件夹,在数据库里填上 /img.php?p={图片连接},这样就可以连封面都直接用外链图片了.
最后放效果视频,九百多篇文章大概用了9分来钟(可以从40秒直接挑到8分42秒).有9篇文章错误是在采集历史数据的时候就出问题,不管它们了.
还有些写入数据库的时候会返回提示信息编码错误之类的,不用管它们,没用问题的.
爬虫程序运行效果https://www.zhihu.com/video/1102614539148791808最后上完整代码:
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 19 10:33:40 2019
获取每篇文章内容,并修改图片显示 ,写入数据库
@author: 浩海泛舟
"""
import 历史消息爬虫 as 包_历史消息爬虫
import codecs as 包_编码
import json
import re as 包_正则
import pymysqldef 方法_读取json文件(路径):文件列表 = []with 包_编码.open(路径, 'r', 'utf-8-sig') as 文件1: 文件 = 文件1.readlines() # 读出来的是一个list新_文件 = json.loads(文件[0], encoding='utf-8')for i in 新_文件:文件列表.append(i)return 文件列表def 方法_替换图片(内容):图片提取_规则 = 包_正则.compile('<img class(.*?)/>')图片路径_规则 = 包_正则.compile('src="(.*?)"')图片列表 = 包_正则.findall(图片提取_规则,内容)替换列表 = []for 图片 in 图片列表:图片路径 = 包_正则.findall(图片路径_规则,图片)图片路径 = 图片路径[0]图片修改 = '<p><img src="../img.php?p=' + 图片路径 + '"></p>'原图片 = '<img class' + 图片 + '/>'替换 = [原图片,图片修改]替换列表.append(替换)return 替换列表#print(文章列表)
def 方法_获取并修改正文内容(网址):网页 = 包_历史消息爬虫.方法_获取网页(网址)内容抽取_规则 = 包_正则.compile('<div class="rich_media_content " id="js_content">(.*?)</div>',包_正则.DOTALL)内容抽取 = 包_正则.findall(内容抽取_规则,网页)内容抽取 = 内容抽取[0].replace(r'n','')图片替换列表 = 方法_替换图片(内容抽取) for 图片替换 in 图片替换列表:内容抽取 = 内容抽取.replace(图片替换[0],图片替换[1])return 内容抽取def 方法_插入数据(sql语句):# 打开数据库连接数据库 = pymysql.connect("数据库网址", "用户名", "密码", "数据库")# 使用cursor()方法获取操作游标 指针操作 = 数据库.cursor()# SQL 插入语句try:# 执行sql语句指针操作.execute(sql语句)# 提交到数据库执行数据库.commit()except:# Rollback in case there is any error数据库.rollback()# 关闭数据库连接数据库.close()def 方法_总方法(路径):文章列表 = 方法_读取json文件(路径)#倒序,时间久的先处理文章列表.reverse()a = 0写入错误列表 = []for 文章 in 文章列表:时间 = 文章[1]标题 = 文章[2]作者 = 文章[3]描述 = 文章[4]封面 = '/img.php?p=' + 文章[6]连接 = 文章[5]try:正文内容 = 方法_获取并修改正文内容(连接)except:写入错误列表.append(文章)continue# SQL 插入语句sql = """INSERT INTO tpt_article(tid,open,commend,choice,title,author,time,pic,description,content) VALUES (1,1,1,1, '%s', '%s', %s, '%s', '%s', '%s')""" %(标题,作者,时间,封面,描述,正文内容)方法_插入数据(sql) a+=1print('已完成',a ,'个数据插入')#if a ==5:# break 包_历史消息爬虫.方法_保存json文件('写入数据库错误列表信息.json',写入错误列表) returnif __name__ == '__main__' :路径 = '魂斗罗公众号信息.json'#文章列表 = 方法_读取json文件(路径)#文章列表.reverse()#print(文章列表[907])方法_总方法(路径)
感谢各位的阅读,望勿喷。