一、环境准备

Python版本:3.5

编辑器:Pycharm

数据库:MYSQL

二、python代码

目前该代码只是一个实现思路,由于搜狗验证码的问题,导致爬取的时候可能IP会被限制,一种思路是使用代理IP来避免验证码的问题,一种就是识别验证码(实现起来有难度),这份代码是将文章爬取下来以HTML格式存储在本地,如果你需要解析到数据库只需要解析本地的HTML文件即可,这一步比较简单,没做了,由于搜狗的网址结构有可能变动,所以有时候需要重新调整正则表达式。

下面是整个爬取的代码:

#!/usr/bin/env python
# coding=utf-8
import time
import os
import requests
import re
import urllib
from urllib import request
from lxml import etree
from bs4 import BeautifulSoup
import pymysql as mdb
import logging
import hashlibclass weichat_spider:def __init__(self, ):self.check = Trueself.htmlPath = 'E:/A_crawling/data/raw/htmlPath/weichat/'self.PicPath = 'E:/A_crawling/data/raw/htmlPath/weichat/'self.headers = Noneself.search_url = Noneself.sublist = Noneself.config = Noneself.conn = None# 从数据库查询公众号列表def getSubList(self):self.config = {'host': 'xxx.xxx.x.xx', 'port': 3306, 'user': 'root', 'passwd': '*****', 'db': '****', 'charset': 'utf8'}self.conn = mdb.connect(**self.config)cursor = self.conn.cursor()try:sql = "select subEname,subName from subscription where status= 1 "cursor.execute(sql)temp = cursor.fetchall()self.conn.commit()return tempexcept Exception as e:logging.error(e)self.conn.rollback()finally:cursor.close()self.conn.close()# 转换成哈希值@staticmethoddef toHash(x):m = hashlib.md5()m.update(x.encode('utf-8'))return m.hexdigest()# 运行程序def run(self):self.sublist = self.getSubList()for self.ename, self.name in self.sublist:self.search_url = "http://weixin.sogou.com/weixin?type=1&s_from=input&query=%s&ie=utf8&_sug_=y&_sug_type_=" % self.nameself.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0", "Referer": self.search_url}print('开始抓取公众号[' + self.name + ']' + time.strftime('%Y-%m-%d') + '的文章' + ':')self.get_list(self.search_url, self.ename)# 获取被爬取公众号的url连接,并且将url传入爬取的函数def get_list(self, search_url, ename):# html = requests.get(search_url, headers=self.headers, verify=False).contentweichat_id = enamehtml_catalog = requests.get(search_url, verify=False).textselector = etree.HTML(html_catalog.encode("UTF-8"))content = selector.xpath('/html/body/div[2]/div/div[4]/ul/li[1]/div/div[2]/p[1]/a')for list_catalog in content:list_catalog = list_catalog.attrib.get('href')self.get_content(list_catalog, weichat_id)# 获得公众号中文章的详情内容def get_content(self, each, weichat_id):# article = requests.get(each, headers=self.headers, verify=False).contenthtml_art_url = requests.get(each, verify=False).textsoup = BeautifulSoup(html_art_url, 'html.parser')soup_url = soup.findAll("script")[7]# 循环获取公众号文章URLfor list_art in soup_url:list_art_url_s = re.findall(r'content_url(.*?),', list_art)# 获取公众号文章for list_art_url in list_art_url_s:list_art_url = 'http://mp.weixin.qq.com' + list_art_url.replace('":"', '').replace('"', '').replace('amp;', '')content = requests.get(list_art_url, verify=False)art_hash_code = self.toHash(content.url)# 以HTML格式保存文章到本地htmlPath = self.htmlPath + weichat_idif not os.path.isdir(htmlPath):os.mkdir(htmlPath)self.get_img_text(list_art_url, weichat_id, content, htmlPath + '/%s.html' % art_hash_code)# 获取公众号图片和内容并且保存到本地文件夹def get_img_text(self, list_art_url, weichat_id, r, out_path):try:# 打开保存路径的文件out_pathf = open(out_path, 'w', encoding='utf-8')text = r.text# 保存图片数据reg = r'-src="(https://mmbiz.qpic.cn/.+?)" '# print(reg)pic_re = re.compile(reg)html_art_url = requests.get(list_art_url, verify=False).textpic_list = re.findall(pic_re, html_art_url)for pic_url in pic_list:print(pic_url)pic_path = self.PicPath + weichat_id + '/' + self.toHash(list_art_url) + '/'if not os.path.isdir(pic_path):os.mkdir(pic_path)pic_url_new = os.path.join(pic_path, '%s.jpeg' % self.toHash(pic_url))urllib.request.urlretrieve(pic_url, pic_url_new)# 替换data-src里面的路径,将图片换成本地路径,使其由JS加载的动态网页变成静态HTML,然后再解析保存在本地的HTML存储到数据库pic_url_all = 'data-src="' + pic_url + '"'rep_pic_url = self.toHash(list_art_url) + '/' + '%s.jpeg' % self.toHash(pic_url)rep_pic_url_all = 'src="' + rep_pic_url + '"'text = text.replace(pic_url_all, rep_pic_url_all)# 替换完text里的数据后将数据写入并保存文件到本地f.write(text)f.flush()f.close()# 解析保存到本地的文章self.explain_art(out_path)except Exception as e:logging.error('save file:[e=%s,out_path=%s]' % (e, out_path))# 解析下载到本地的公众号文章并且尝试存入数据库@staticmethoddef explain_art(local_art_url):# content = requests.get(local_art_url, verify=False).texthtmlfile = open(local_art_url, 'r', encoding='UTF-8')htmlpage = htmlfile.read()content_html = BeautifulSoup(htmlpage, 'lxml')selector = etree.HTML(content_html.encode("UTF-8"))# 文章标题art_title = selector.xpath('//*[@id="activity-name"]')[0].text# 文章作者art_author_list = selector.xpath('/html/body/div[1]/div/div[1]/div[1]/div[1]/em[2]')if len(art_author_list) > 0:art_author = art_author_list[0].text# 文章发表时间art_time = selector.xpath('//*[@id="post-date"]')[0].text# 文章来源art_source = selector.xpath('//*[@id="post-user"]')[0].text# 文章正文内容# art_connect = selector.xpath('//*[@id="activity-name"]')art_connect = content_html.findAll('div', class_='rich_media_content')[0].contents# print(art_connect)if __name__ == '__main__':# @version : 3.5# @Author  : robot_lei# @Software: PyCharm Community Editionprint("""/***                                 _oo8oo_*                                o8888888o*                                88" . "88*                                (| -_- |)*                                0\  =  /0*                              ___/'==='\___*                            .' \\\|     |// '.*                           / \\\|||  :  |||// \\*                          / _||||| -:- |||||_ \\*                         |   |  \\\\  -  //  |   |*                         | \_|  ''\---/''  |_/ |*                         \  .-\__  '-'  __/-.  /*                       ___'. .'  /--.--\  '. .'___*                    ."" '<  '.___\_<|>_/___.'  >' "".*                   | | :  `- \`.:`\ _ /`:.`/ -`  : | |*                   \  \ `-.   \_ __\ /__ _/   .-` /  /*               =====`-.____`.___ \_____/ ___.`____.-`=====*                                 `=---=`*             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*                        佛祖保佑        永无BUG**/ """)weichat_spider().run()

以下为MYSQL的建表语句:

CREATE TABLE `subscription` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`subEname` varchar(45) DEFAULT NULL,--微信号`subName` varchar(45) DEFAULT NULL,--公众号`status` tinyint(1) DEFAULT '1' COMMENT '1默认爬取   0  不爬取',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4--  4  itpuber   ITPUB    1      插入数据 爬取的是ITPUB

三、爬取结果

下图就是爬取的页面保存在本地文档之中,打开可以看到文章页面都是正常的,图片保存在相应hash码的文件夹下面。

未完成问题:

1、验证码问题

2、未将下载下来的HTML文本解析进数据库中保存(目前没时间写,以后在补),有需要的也可以自行解析入库。

python实现搜狗微信公众号数据爬取相关推荐

  1. python微信爬取教程_[python]微信公众号文章爬取

    [python]微信公众号文章爬取 需求 爬取一些微信公众号的文章 数据来源 1.搜狗微信搜索,可以搜索微信公众号文章,但只能显示该公众号最近十篇的文章 2.通过个人微信公众号中的素材管理,查看其他微 ...

  2. 微信公众号文章爬取方法整理

    微信公众号文章爬取方法整理 1.用python爬取 http://blog.csdn.net/d1240673769/article/details/75907152 实现方法:通过微信提供的公众号文 ...

  3. python3实现微信公众号文章爬取

    基于搜狗微信的文章爬取 前言:文章仅用于学习交流,不足之处欢迎小伙伴指正! 一.功能介绍: 已实现功能: 1.爬取搜狗微信上的分类一栏的所有事件及其他的所有标题事件和加载更多,返回文章链接与标题,并存 ...

  4. 带大家写一波微信公众号的爬取

    开发工具 python版本 : 3.6.4 相关模块: pdfkit模块: requests模块: 以及一些Python自带的模块. 抓包工具: fiddler 环境搭建 python 环境 安装Py ...

  5. 带大家写一波微信公众号的爬取!谁说微信爬不了的!

    开发工具 python版本 : 3.6.4 相关模块: pdfkit模块: requests模块: 以及一些Python自带的模块. 抓包工具: fiddler 环境搭建 python 环境 安装Py ...

  6. 如何用python爬取公众号文章搜狗微信搜索_python如何爬取搜狗微信公众号文章永久链接的思路解析...

    这篇文章主要介绍了python如何爬取搜狗微信公众号文章永久链接的思路解析 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧. 本文主要讲解思路,代码部分请自行解决搜狗微信 ...

  7. python爬取微信公众号_Python爬取微信公众号(中间人代理法)

    1.环境:ubuntu16.04 + redis + mysql + python3.5 + anyproxy + android + pm2 + npm + node 一台爬虫服,python3环境 ...

  8. 使用WebCollector爬虫框架进行微信公众号文章爬取并持久化

    〇.Java爬虫框架有哪些? 1.nutch:Apache下开源爬虫项目,适合做搜索引擎,分布式爬虫只是其中一个功能,功能丰富,文档完整. 2.heritrix:比较成熟,用的人较多,有自己的web管 ...

  9. 微信公众号文章爬取下载各种格式

    微信公众号阅读成为许多人每天的日常习惯,相信在每天关注的微信公众号中,总会有一些作者在持续地输出优质内容. 这些内容也许是你所处领域的精华,也许其中的观点启人深思,也许是单纯地喜欢上了某个大V的文字. ...

最新文章

  1. centos7下解决tomcat启动慢的问题
  2. boost::intrusive::splaytree_algorithms用法的测试程序
  3. 【STM32】FreeRTOS列表应用示例
  4. windows2003添加普通用户的远程桌面权限
  5. es统计有多少个分组_ES 24 - 如何通过Elasticsearch进行聚合检索 (分组统计)
  6. 掌握基本的Java程序开发过程 题库 1213
  7. javascript-布尔-空与未定义-查看数据类型
  8. windows下常用DOS命令
  9. linux下清空c++ cin无效流的方式
  10. 大约HR升级版的设计为组汇总
  11. [转]Vue生态系统中的库
  12. linux 动态内存分配,具体来说,fork()如何处理Linux中malloc()动态分配的内存?
  13. Q109:用PBRT渲染Blender导出的模型
  14. yii2怎样写规则可以隐藏url地址里的控制器名字
  15. VMWare Network Adapter设置错误也会导致 Determining IP information for eth0 failed
  16. mysql个人记账系统_个人记账系统
  17. 计算适应度函数(目标函数)(单目标)
  18. 从0到1CTFer成长之路环境搭建详细教程
  19. EXCEL如何快速拆分合并单元格数据
  20. 解决VMware虚拟机中鼠标闪烁问题

热门文章

  1. AngularJS 0004:模型
  2. 非道路国四相关的示意图
  3. 最短路径问题(Dijkstra算法)
  4. WinServer添加任务计划
  5. JavaScript 高性能数组去重
  6. linux 批量修改文件格式
  7. 支付宝开收信用卡还款买路钱
  8. 简单的一招,解决Android手机越来越慢的问题
  9. 王者荣耀s15服务器维护,王者荣耀s15赛季王者峡谷调整 远程打野基本废了
  10. 【leetcode 929】独特的电子邮件地址