php 爬虫_公众号简单爬虫--把公众号文章全部转载到网站(三)

2a9f38703f20cbf9424e22495baffee1.png

公众号简单爬虫--把公众号文章全部转载到网站(三)

根据上一篇的方法,我们得到了一个包含标题,时间,作者,封面,文章连接等信息的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];
}
?>

1e9885a37fb1fcd7721c1e8b9873cfa5.png

那么所有的图片都要修改,详细见下面代码.

再有就是封面图,网站没用提供外链功能,那么我们可以自己处理一下,把上面的img.php文件复制一份,拷贝到upload文件夹,在数据库里填上 /img.php?p={图片连接},这样就可以连封面都直接用外链图片了.

f65ff86a47be1334bb35496ccfaefa8e.png

最后放效果视频,九百多篇文章大概用了9分来钟(可以从40秒直接挑到8分42秒).有9篇文章错误是在采集历史数据的时候就出问题,不管它们了.

还有些写入数据库的时候会返回提示信息编码错误之类的,不用管它们,没用问题的.

6861f4037e8bb8dc2ac07307b6f12437.png
爬虫程序运行效果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 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('<img class(.*?)/>')
    图片路径_规则 = 包_正则.compile('src="(.*?)"')
    图片列表 = 包_正则.findall(图片提取_规则,内容)
    替换列表 = []
    for 图片 in 图片列表:
        图片路径 = 包_正则.findall(图片路径_规则,图片)
        图片路径 = 图片路径[0]
        图片修改 = '&lt;p&gt;&lt;img src=&quot;../img.php?p=' + 图片路径 + '&quot;&gt;&lt;/p&gt;'
        原图片 = '<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+=1
        print('已完成',a ,'个数据插入')
        #if a ==5:
        #    break 
    包_历史消息爬虫.方法_保存json文件('写入数据库错误列表信息.json',写入错误列表)      
    return
    
if __name__ == '__main__' :
    路径 = '魂斗罗公众号信息.json'
    #文章列表 = 方法_读取json文件(路径)
    #文章列表.reverse()
    #print(文章列表[907])
    方法_总方法(路径)
    

感谢各位的阅读,望勿喷。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值