python采集微信公众号文章


Posted in Python onDecember 20, 2018

本文实例为大家分享了python采集微信公众号文章的具体代码,供大家参考,具体内容如下

在python一个子目录里存2个文件,分别是:采集公众号文章.py和config.py。 代码如下:

1.采集公众号文章.py

from urllib.parse import urlencode
import pymongo
import requests
from lxml.etree import XMLSyntaxError
from requests.exceptions import ConnectionError
from pyquery import PyQuery as pq
from config import *
 
#配置MongoDB
client = pymongo.MongoClient(MONGO_URI)
db = client[MONGO_DB]
 
base_url = 'http://weixin.sogou.com/weixin?'
#添加头文件
headers = {
  'Cookie': 'usid=S-pkM6vW_ac4ktr1; SUV=00A75E9078EFD9F75A6573ECAD0EC883; wuid=AAGCxerSHQAAAAqRGn4SoAgAAAA=; IPLOC=CN4414; SUID=767BEAB73220910A000000005AA9E2AA; pgv_pvi=159197184; pgv_si=s8252565504; ABTEST=0|1521083055|v1; weixinIndexVisited=1; sct=1; JSESSIONID=aaalXqKRP6JjS8ac4Hwhw; ppinf=5|1521083238|1522292838|dHJ1c3Q6MToxfGNsaWVudGlkOjQ6MjAxN3x1bmlxbmFtZTo2OiUzQSUyOXxjcnQ6MTA6MTUyMTA4MzIzOHxyZWZuaWNrOjY6JTNBJTI5fHVzZXJpZDo0NDpvOXQybHVOaExNcS1vLW1zbjMxMmNMSkp4OGpZQHdlaXhpbi5zb2h1LmNvbXw; pprdig=tbVf7qLZdDMjpCn4jTf3dg8C8NeRX-YgDi8KUcezn0rteWuhkgU4xMNaxZbakVQuswboIGl_rD-34abU6VY9Jkv7me3BypigyDnIv2lJUchGCo7Gk58m9Qhrm3Aa7NHLHjFVYoaQkQgBSYKpatxMNPe3Tm57ZDlzdPg_8mBmBNQ; sgid=23-30671195-AVqp42ZctqiaCybbDvvfWno4; PHPSESSID=4jjk2a9rv6kq7m50f42r92u3r3; SUIR=D2DF4E12A5A1C3CE1A8AD7F2A5FE18FE; ppmdig=1521087492000000855f9824f94abe82b25d2839135ad3a8; SNUID=FEF36D3F8882EFEC4FCF61E68801DA49; seccodeRight=success; successCount=1|Thu, 15 Mar 2018 04:23:23 GMT',
  'Host': 'weixin.sogou.com',
  'Referer': 'http://weixin.sogou.com/antispider/?from=%2fweixin%3Fquery%3d%E9%A3%8E%E6%99%AF%26type%3d2%26page%3d95%26ie%3dutf8',
  'Upgrade-Insecure-Requests': '1',
  'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'
}
#初始化代理为本地IP
proxy = None
 
#定义获取代理函数
def get_proxy():
  try:
    response = requests.get(PROXY_POOL_URL)
    if response.status_code == 200:
      return response.text
    return None
  except ConnectionError:
    return None
 
#添加代理获取网页内容
def get_html(url, count=1):
  print('Crawling', url)
  print('Trying Count', count)
  global proxy
  if count >= MAX_COUNT:
    print('Tried Too Many Counts')
    return None
  try:
    if proxy:
      proxies = {
        'http': 'http://' + proxy
      }
      response = requests.get(url, allow_redirects=False, headers=headers, proxies=proxies)
    else:
      response = requests.get(url, allow_redirects=False, headers=headers)
    if response.status_code == 200:
      return response.text
    if response.status_code == 302:
      # Need Proxy
      print('302')
      proxy = get_proxy()
      if proxy:
        print('Using Proxy', proxy)
        return get_html(url)
      else:
        print('Get Proxy Failed')
        return None
  except ConnectionError as e:
    print('Error Occurred', e.args)
    proxy = get_proxy()
    count += 1
    return get_html(url, count)
 
 
#获取索引页内容
def get_index(keyword, page):
  data = {
    'query': keyword,
    'type': 2,
    'page': page
  }
  queries = urlencode(data)
  url = base_url + queries
  html = get_html(url)
  return html
 
#解析索引页,提取详情页网址
def parse_index(html):
  doc = pq(html)
  items = doc('.news-box .news-list li .txt-box h3 a').items()
  for item in items:
    yield item.attr('href')
 
#获取详情页
def get_detail(url):
  try:
    response = requests.get(url)
    if response.status_code == 200:
      return response.text
    return None
  except ConnectionError:
    return None
 
#解析索引页,返回微信文章标题、内容、日期、公众号名称等
def parse_detail(html):
  try:
    doc = pq(html)
    title = doc('.rich_media_title').text()
    content = doc('.rich_media_content').text()
    date = doc('#post-date').text()
    nickname = doc('#js_profile_qrcode > div > strong').text()
    wechat = doc('#js_profile_qrcode > div > p:nth-child(3) > span').text()
    return {
      'title': title,
      'content': content,
      'date': date,
      'nickname': nickname,
      'wechat': wechat
    }
  except XMLSyntaxError:
    return None
 
#存储到MongoDB,去重操作
def save_to_mongo(data):
  if db['articles'].update({'title': data['title']}, {'$set': data}, True):
    print('Saved to Mongo', data['title'])
  else:
    print('Saved to Mongo Failed', data['title'])
 
#主函数
def main():
  for page in range(1, 101):
    html = get_index(KEYWORD, page)
    if html:
      article_urls = parse_index(html)
      for article_url in article_urls:
        article_html = get_detail(article_url)
        if article_html:
          article_data = parse_detail(article_html)
          print(article_data)
 
 
if __name__ == '__main__':
  main()

2.config.py代码:

#爬取公众号文章
PROXY_POOL_URL = 'http://127.0.0.1:5000/get'
KEYWORD ='计算机等级二级'   # 输入关键词
MONGO_URI = 'localhost' 
MONGO_DB = 'data'
MAX_COUNT = 5

其中,config.py中KEYWORD为查找关键词,可以根据需要更改。经实测,运行"采集公众号文章.py"成功!若因受限不成功,可多运行几次。

python采集微信公众号文章

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅谈pyhton学习中出现的各种问题(新手必看)
May 17 Python
pycharm+django创建一个搜索网页实例代码
Jan 24 Python
python中virtualenvwrapper安装与使用
May 20 Python
Python实现的读取电脑硬件信息功能示例
May 30 Python
python字符串分割及字符串的一些常规方法
Jul 24 Python
python绘图模块matplotlib示例详解
Jul 26 Python
基于Python的图像数据增强Data Augmentation解析
Aug 13 Python
python实现两个文件夹的同步
Aug 29 Python
Pandas数据离散化原理及实例解析
Nov 16 Python
浅谈Python3多线程之间的执行顺序问题
May 02 Python
什么是python的必选参数
Jun 21 Python
python之随机数函数的实现示例
Dec 30 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 #Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
Dec 19 #Python
python3实现网络爬虫之BeautifulSoup使用详解
Dec 19 #Python
python爬虫超时的处理的实例
Dec 19 #Python
pycharm中使用anaconda部署python环境的方法步骤
Dec 19 #Python
Django框架模板注入操作示例【变量传递到模板】
Dec 19 #Python
python json.loads兼容单引号数据的方法
Dec 19 #Python
You might like
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
PHP curl 获取响应的状态码的方法
2014/01/13 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
2014/04/25 PHP
ThinkPHP的I方法使用详解
2014/06/18 PHP
PHP中判断文件存在使用is_file还是file_exists?
2015/04/03 PHP
详细解读PHP的Yii框架中登陆功能的实现
2015/08/21 PHP
php gd等比例缩放压缩图片函数
2016/06/12 PHP
广告切换效果(缓动切换)
2009/05/27 Javascript
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
jQuery 定时局部刷新(setInterval)
2010/11/19 Javascript
固定网页背景图同时保持图片比例的思路代码
2013/08/15 Javascript
js获得页面的高度和宽度的方法
2014/02/23 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
javascript实现捕捉键盘上按下的键
2015/05/05 Javascript
理解Javascript的动态语言特性
2015/06/17 Javascript
详解wow.js中各种特效对应的类名
2017/09/13 Javascript
Postman模拟发送带token的请求方法
2018/03/31 Javascript
Vue路由history模式解决404问题的几种方法
2018/09/29 Javascript
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
2019/04/28 Javascript
通过实例解析JavaScript for in及for of区别
2020/06/15 Javascript
简单介绍Python中的decode()方法的使用
2015/05/18 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
2017/01/20 Python
python实现简易云音乐播放器
2018/01/04 Python
Django forms组件的使用教程
2018/10/08 Python
Python设计模式之解释器模式原理与用法实例分析
2019/01/10 Python
Windows下python3安装tkinter的问题及解决方法
2020/01/06 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
2020/01/09 Python
python设置环境变量的作用整理
2020/02/17 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
Python爬虫开发与项目实战
2020/12/16 Python
pyspark对Mysql数据库进行读写的实现
2020/12/30 Python
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
英国第一的市场和亚马逊替代品:OnBuy
2019/03/16 全球购物
htmlentities() 和 htmlspecialchars()有什么区别
2015/07/01 面试题
新教师培训心得体会
2014/09/02 职场文书
廉洁自律个人总结
2015/02/14 职场文书