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 相关文章推荐
Python生成验证码实例
Aug 21 Python
Python3读取zip文件信息的方法
May 22 Python
python编程嵌套函数实例代码
Feb 11 Python
python 判断参数为Nonetype类型或空的实例
Oct 30 Python
python3.6使用tkinter实现弹跳小球游戏
May 09 Python
对python 中class与变量的使用方法详解
Jun 26 Python
python从list列表中选出一个数和其对应的坐标方法
Jul 20 Python
Django 静态文件配置过程详解
Jul 23 Python
keras实现多GPU或指定GPU的使用介绍
Jun 17 Python
python图片合成的示例
Nov 09 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
Feb 06 Python
在pycharm中无法import所安装的库解决方案
May 31 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中的正规表达式(一)
2006/10/09 PHP
smarty模板引擎之分配数据类型
2015/03/30 PHP
php Session无效分析资料整理
2016/11/29 PHP
PHP实现图片批量打包下载功能
2017/03/01 PHP
PHP实现的简单操作SQLite数据库类与用法示例
2017/06/19 PHP
微信推送功能实现方式图文详解
2019/07/12 PHP
JS对象转换为Jquery对象实现代码
2013/12/29 Javascript
利用js实现禁止复制文本信息
2015/06/03 Javascript
angularjs学习笔记之简单介绍
2015/09/26 Javascript
使用node.js中的Buffer类处理二进制数据的方法
2016/11/26 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
2017/06/16 jQuery
nodejs开发微信小程序实现密码加密
2017/07/11 NodeJs
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
基于BootStrap的文本编辑器组件Summernote
2017/10/27 Javascript
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
Vue.js组件使用props传递数据的方法
2019/10/19 Javascript
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
给Python中的MySQLdb模块添加超时功能的教程
2015/05/05 Python
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
Python中的Descriptor描述符学习教程
2016/06/02 Python
Python自动生产表情包
2017/03/17 Python
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
python处理document文档保留原样式
2019/09/23 Python
python实现简单图书管理系统
2019/11/22 Python
基于pandas中expand的作用详解
2019/12/17 Python
Django 5种类型Session使用方法解析
2020/04/29 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
2021/02/03 Python
大学生求职中的自我评价
2013/10/01 职场文书
自我鉴定思想方面
2013/10/07 职场文书
市场部经理岗位职责
2014/04/10 职场文书
大学生安全责任书
2014/07/25 职场文书
前台岗位职责范本
2015/04/16 职场文书
讲文明倡议书
2015/04/29 职场文书
名人传读书笔记
2015/06/26 职场文书