网海拾贝网络猪 / python / 公众号简单爬虫

0 0

   

公众号简单爬虫

2020-02-05  网海拾贝...

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

根据上一篇的方法,我们得到了一个包含标题,时间,作者,封面,文章连接等信息的json文件.接下来,就是要提取文章详细信息和把一系列的信息写入数据库.

这里先说明几点,我们转贴公众号文章,会有个问题,就是图片会不显示.由于网站源码是php的,所以我们要自己写一个 img.php文件放在网站根目录下,作用是让转贴的图片能显示出来.

代码如下:

  1. <?php
  2. header('Content-Type:image/gif');
  3. $p=$_GET['p'];
  4. $pics=file($p);
  5. for($i=0;$i< count($pics);$i++)
  6. {
  7. echo $pics[$i];
  8. }
  9. ?>

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

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

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

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

爬虫程序运行效果

视频连接

最后上完整代码:

  1. # -*- coding: utf-8 -*-
  2. '''
  3. Created on Fri Apr 19 10:33:40 2019
  4. 获取每篇文章内容,并修改图片显示 ,写入数据库
  5. @author: 浩海泛舟
  6. '''
  7. import 历史消息爬虫 as 包_历史消息爬虫
  8. import codecs as 包_编码
  9. import json
  10. import re as 包_正则
  11. import pymysql
  12. def 方法_读取json文件(路径):
  13. 文件列表 = []
  14. with 包_编码.open(路径, 'r', 'utf-8-sig') as 文件1:
  15. 文件 = 文件1.readlines() # 读出来的是一个list
  16. 新_文件 = json.loads(文件[0], encoding='utf-8')
  17. for i in 新_文件:
  18. 文件列表.append(i)
  19. return 文件列表
  20. def 方法_替换图片(内容):
  21. 图片提取_规则 = 包_正则.compile('<img class(.*?)/>')
  22. 图片路径_规则 = 包_正则.compile('data-src='(.*?)'')
  23. 图片列表 = 包_正则.findall(图片提取_规则,内容)
  24. 替换列表 = []
  25. for 图片 in 图片列表:
  26. 图片路径 = 包_正则.findall(图片路径_规则,图片)
  27. 图片路径 = 图片路径[0]
  28. 图片修改 = '&lt;p&gt;&lt;img src=&quot;../img.php?p=' + 图片路径 + '&quot;&gt;&lt;/p&gt;'
  29. 原图片 = '<img class' + 图片 + '/>'
  30. 替换 = [原图片,图片修改]
  31. 替换列表.append(替换)
  32. return 替换列表
  33. #print(文章列表)
  34. def 方法_获取并修改正文内容(网址):
  35. 网页 = 包_历史消息爬虫.方法_获取网页(网址)
  36. 内容抽取_规则 = 包_正则.compile('<div class='rich_media_content ' id='js_content'>(.*?)</div>',包_正则.DOTALL)
  37. 内容抽取 = 包_正则.findall(内容抽取_规则,网页)
  38. 内容抽取 = 内容抽取[0].replace(r'\n','')
  39. 图片替换列表 = 方法_替换图片(内容抽取)
  40. for 图片替换 in 图片替换列表:
  41. 内容抽取 = 内容抽取.replace(图片替换[0],图片替换[1])
  42. return 内容抽取
  43. def 方法_插入数据(sql语句):
  44. # 打开数据库连接
  45. 数据库 = pymysql.connect('数据库网址', '用户名', '密码', '数据库')
  46. # 使用cursor()方法获取操作游标
  47. 指针操作 = 数据库.cursor()
  48. # SQL 插入语句
  49. try:
  50. # 执行sql语句
  51. 指针操作.execute(sql语句)
  52. # 提交到数据库执行
  53. 数据库.commit()
  54. except:
  55. # Rollback in case there is any error
  56. 数据库.rollback()
  57. # 关闭数据库连接
  58. 数据库.close()
  59. def 方法_总方法(路径):
  60. 文章列表 = 方法_读取json文件(路径)
  61. #倒序,时间久的先处理
  62. 文章列表.reverse()
  63. a = 0
  64. 写入错误列表 = []
  65. for 文章 in 文章列表:
  66. 时间 = 文章[1]
  67. 标题 = 文章[2]
  68. 作者 = 文章[3]
  69. 描述 = 文章[4]
  70. 封面 = '/img.php?p=' + 文章[6]
  71. 连接 = 文章[5]
  72. try:
  73. 正文内容 = 方法_获取并修改正文内容(连接)
  74. except:
  75. 写入错误列表.append(文章)
  76. continue
  77. # SQL 插入语句
  78. 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')''' %(标题,作者,时间,封面,描述,正文内容)
  79. 方法_插入数据(sql)
  80. a+=1
  81. print('已完成',a ,'个数据插入')
  82. #if a ==5:
  83. # break
  84. 包_历史消息爬虫.方法_保存json文件('写入数据库错误列表信息.json',写入错误列表)
  85. return
  86. if __name__ == '__main__' :
  87. 路径 = '魂斗罗公众号信息.json'
  88. #文章列表 = 方法_读取json文件(路径)
  89. #文章列表.reverse()
  90. #print(文章列表[907])
  91. 方法_总方法(路径)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。如发现有害或侵权内容,请点击这里 或 拨打24小时举报电话:4000070609 与我们联系。

    猜你喜欢

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多