公众号简单爬虫--把公众号文章全部转载到网站(三)
根据上一篇的方法,我们得到了一个包含标题,时间,作者,封面,文章连接等信息的json文件.接下来,就是要提取文章详细信息和把一系列的信息写入数据库.
这里先说明几点,我们转贴公众号文章,会有个问题,就是图片会不显示.由于网站源码是php的,所以我们要自己写一个 img.php文件放在网站根目录下,作用是让转贴的图片能显示出来.
代码如下:
那么所有的图片都要修改,详细见下面代码.
再有就是封面图,网站没用提供外链功能,那么我们可以自己处理一下,把上面的img.php文件复制一份,拷贝到upload文件夹,在数据库里填上 /img.php?p={图片连接},这样就可以连封面都直接用外链图片了.
最后放效果视频,九百多篇文章大概用了9分来钟(可以从40秒直接挑到8分42秒).有9篇文章错误是在采集历史数据的时候就出问题,不管它们了.
还有些写入数据库的时候会返回提示信息编码错误之类的,不用管它们,没用问题的.
爬虫程序运行效果
视频连接
最后上完整代码:
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 19 10:33:40 2019
获取每篇文章内容,并修改图片显示 ,写入数据库
@author: 浩海泛舟
"""
import 历史消息爬虫 as 包_历史消息爬虫
import codecs as 包_编码
import json
import re as 包_正则
import pymysql
def 方法_读取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('')
图片路径_规则 = 包_正则.compile('data-src="(.*?)"')
图片列表 = 包_正则.findall(图片提取_规则,内容)
替换列表 = []
for 图片 in 图片列表:
图片路径 = 包_正则.findall(图片路径_规则,图片)
图片路径 = 图片路径[0]
图片修改 = '<p><img src="../img.php?p=' + 图片路径 + '"></p>'
原图片 = ''
替换 = [原图片,图片修改]
替换列表.append(替换)
return 替换列表
#print(文章列表)
def 方法_获取并修改正文内容(网址):
网页 = 包_历史消息爬虫.方法_获取网页(网址)
内容抽取_规则 = 包_正则.compile('(.*?)',包_正则.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+=1
print('已完成',a ,'个数据插入')
#if a ==5:
# break
包_历史消息爬虫.方法_保存json文件('写入数据库错误列表信息.json',写入错误列表)
return
if __name__ == '__main__' :
路径 = '魂斗罗公众号信息.json'
#文章列表 = 方法_读取json文件(路径)
#文章列表.reverse()
#print(文章列表[907])
方法_总方法(路径)
感谢各位的阅读,望勿喷。