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中操作字符串之replace()方法的使用
May 19 Python
django 使用 request 获取浏览器发送的参数示例代码
Jun 11 Python
python实现简单图片物体标注工具
Mar 18 Python
Python3.6中Twisted模块安装的问题与解决
Apr 15 Python
python pygame实现挡板弹球游戏
Nov 25 Python
python使用rsa非对称加密过程解析
Dec 28 Python
python实现查找所有程序的安装信息
Feb 18 Python
python ffmpeg任意提取视频帧的方法
Feb 21 Python
appium+python adb常用命令分享
Mar 06 Python
解决Keras 中加入lambda层无法正常载入模型问题
Jun 16 Python
Python利用socket模块开发简单的端口扫描工具的实现
Jan 27 Python
Python图像处理之图像拼接
Apr 28 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性能优化 产生高度优化代码
2011/07/22 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
PHP实现原比例生成缩略图的方法
2016/02/03 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
js中的屏蔽的使用示例
2013/07/30 Javascript
查看大图功能代码jquery版
2013/11/05 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
JavaScript中的Truthy和Falsy介绍
2015/01/01 Javascript
JS实现为表格动态添加标题的方法
2015/03/31 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
自动完成的搜索框javascript实现
2016/02/26 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
vue.js实现插入数值与表达式的方法分析
2018/07/06 Javascript
纯js实现无缝滚动功能代码实例
2020/02/21 Javascript
Vue如何提升首屏加载速度实例解析
2020/06/25 Javascript
python中的lambda表达式用法详解
2016/06/22 Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
2018/01/23 Python
Python多进程并发与多线程并发编程实例总结
2018/02/08 Python
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
Python绘图Matplotlib之坐标轴及刻度总结
2019/06/28 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
2019/08/12 Python
centos+nginx+uwsgi+Django实现IP+port访问服务器
2019/11/15 Python
python 实现绘制整齐的表格
2019/11/18 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
什么是"引用"?申明和使用"引用"要注意哪些问题?
2016/03/03 面试题
手术室护士自我鉴定
2013/10/14 职场文书
法学专业毕业生自荐信范文
2013/12/18 职场文书
小学生元旦感言
2014/02/26 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
环境日宣传活动总结
2014/07/09 职场文书
2015年幼儿教师个人工作总结
2015/05/20 职场文书
家装电话营销开场白
2015/05/29 职场文书
2016党员党章学习心得体会
2016/01/14 职场文书
高中英语教学反思范文
2016/03/02 职场文书
使用CSS设置滚动条样式
2022/01/18 HTML / CSS