python使用webdriver爬取微信公众号


Posted in Python onAugust 31, 2018

本文实例为大家分享了python使用webdriver爬取微信公众号的具体代码,供大家参考,具体内容如下

# -*- coding: utf-8 -*-

from selenium import webdriver
import time
import json
import requests
import re
import random

#微信公众号账号
user=""
#公众号密码
password=""
#设置要爬取的公众号列表
gzlist=['香河微服务']

#登录微信公众号,获取登录之后的cookies信息,并保存到本地文本中
def weChat_login():
  #定义一个空的字典,存放cookies内容
  post={}

  #用webdriver启动谷歌浏览器
  print("启动浏览器,打开微信公众号登录界面")
  driver = webdriver.Chrome(executable_path='E:\\program\\chromedriver.exe')
  #打开微信公众号登录页面
  driver.get('https://mp.weixin.qq.com/')
  #等待5秒钟
  time.sleep(5)
  print("正在输入微信公众号登录账号和密码......")
  #清空账号框中的内容
  driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/form/div[1]/div[1]/div/span/input").clear()
  #自动填入登录用户名
  driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/form/div[1]/div[1]/div/span/input").send_keys(user)
  #清空密码框中的内容
  driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/form/div[1]/div[2]/div/span/input").clear()
  #自动填入登录密码
  driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/form/div[1]/div[2]/div/span/input").send_keys(password)

  # 在自动输完密码之后需要手动点一下记住我
  print("请在登录界面点击:记住账号")
  time.sleep(10)
  #自动点击登录按钮进行登录
  driver.find_element_by_xpath("//*[@id=\"header\"]/div[2]/div/div/form/div[4]/a").click()
  # 拿手机扫二维码!
  print("请拿手机扫码二维码登录公众号")
  time.sleep(20)
  print("登录成功")
  #重新载入公众号登录页,登录之后会显示公众号后台首页,从这个返回内容中获取cookies信息
  driver.get('https://mp.weixin.qq.com/')
  #获取cookies
  cookie_items = driver.get_cookies()

  #获取到的cookies是列表形式,将cookies转成json形式并存入本地名为cookie的文本中
  for cookie_item in cookie_items:
    post[cookie_item['name']] = cookie_item['value']
  cookie_str = json.dumps(post)
  with open('cookie.txt', 'w+') as f:
    f.write(cookie_str)
  print("cookies信息已保存到本地")

#爬取微信公众号文章,并存在本地文本中
def get_content(query):
  #query为要爬取的公众号名称
  #公众号主页
  url = 'https://mp.weixin.qq.com'
  #设置headers
  header = {
    "HOST": "mp.weixin.qq.com",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0"
  }

  #读取上一步获取到的cookies
  with open('cookie.txt', 'r') as f:
    cookie = f.read().decode("UTF-8")
  cookies = json.loads(cookie)

  #登录之后的微信公众号首页url变化为:https://mp.weixin.qq.com/cgi-bin/home?t=home/index&lang=zh_CN&token=1849751598,从这里获取token信息
  response = requests.get(url=url, cookies=cookies)
  token = re.findall(r'token=(\d+)', str(response.url))[0]

  #搜索微信公众号的接口地址
  search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?'
  #搜索微信公众号接口需要传入的参数,有三个变量:微信公众号token、随机数random、搜索的微信公众号名字
  query_id = {
    'action': 'search_biz',
    'token' : token,
    'lang': 'zh_CN',
    'f': 'json',
    'ajax': '1',
    'random': random.random(),
    'query': query,
    'begin': '0',
    'count': '5'
  }
  #打开搜索微信公众号接口地址,需要传入相关参数信息如:cookies、params、headers
  search_response = requests.get(search_url, cookies=cookies, headers=header, params=query_id)
  #取搜索结果中的第一个公众号
  lists = search_response.json().get('list')[0]
  #获取这个公众号的fakeid,后面爬取公众号文章需要此字段
  fakeid = lists.get('fakeid')

  #微信公众号文章接口地址
  appmsg_url = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
  #搜索文章需要传入几个参数:登录的公众号token、要爬取文章的公众号fakeid、随机数random
  query_id_data = {
    'token': token,
    'lang': 'zh_CN',
    'f': 'json',
    'ajax': '1',
    'random': random.random(),
    'action': 'list_ex',
    'begin': '0',#不同页,此参数变化,变化规则为每页加5
    'count': '5',
    'query': '',
    'fakeid': fakeid,
    'type': '9'
  }
  #打开搜索的微信公众号文章列表页
  appmsg_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
  #获取文章总数
  max_num = appmsg_response.json().get('app_msg_cnt')
  #每页至少有5条,获取文章总的页数,爬取时需要分页爬
  num = int(int(max_num) / 5)
  #起始页begin参数,往后每页加5
  begin = 0
  while num + 1 > 0 :
    query_id_data = {
      'token': token,
      'lang': 'zh_CN',
      'f': 'json',
      'ajax': '1',
      'random': random.random(),
      'action': 'list_ex',
      'begin': '{}'.format(str(begin)),
      'count': '5',
      'query': '',
      'fakeid': fakeid,
      'type': '9'
    }
    print('正在翻页:--------------',begin)

    #获取每一页文章的标题和链接地址,并写入本地文本中
    query_fakeid_response = requests.get(appmsg_url, cookies=cookies, headers=header, params=query_id_data)
    fakeid_list = query_fakeid_response.json().get('app_msg_list')
    for item in fakeid_list:
      content_link=item.get('link')
      content_title=item.get('title')
      fileName=query+'.txt'
      # with open('e://xhwfw.txt','a') as fh:
        # fh.write(content_title+":\n"+content_link+"\n")
      print content_title+":\n"+content_link+"\n"
    num -= 1
    begin = int(begin)
    begin+=5
    time.sleep(2)

if __name__=='__main__':
  try:
    #登录微信公众号,获取登录之后的cookies信息,并保存到本地文本中
    weChat_login()
    #登录之后,通过微信公众号后台提供的微信公众号文章接口爬取文章
    for query in gzlist:
      #爬取微信公众号文章,并存在本地文本中
      print("开始爬取公众号:"+query)
      get_content(query)
      print("爬取完成")
  except Exception as e:
    print(str(e))

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

Python 相关文章推荐
Python正则表达式如何进行字符串替换实例
Dec 28 Python
Python入门_浅谈for循环、while循环
May 16 Python
通过python将大量文件按修改时间分类的方法
Oct 17 Python
python numpy实现文件存取的示例代码
May 26 Python
Python图像处理模块ndimage用法实例分析
Sep 05 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
Feb 25 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
Apr 29 Python
python 双循环遍历list 变量判断代码
May 04 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
Jul 13 Python
pycharm最新激活码有效期至2100年(亲测可用)
Feb 05 Python
pytorch Dataset,DataLoader产生自定义的训练数据案例
Mar 03 Python
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
Jun 23 Python
python爬取微信公众号文章
Aug 31 #Python
Python单向链表和双向链表原理与用法实例详解
Aug 31 #Python
Python使用Flask-SQLAlchemy连接数据库操作示例
Aug 31 #Python
浅谈Python traceback的优雅处理
Aug 31 #Python
python梯度下降法的简单示例
Aug 31 #Python
wxPython的安装与使用教程
Aug 31 #Python
python traceback捕获并打印异常的方法
Aug 31 #Python
You might like
《PHP编程最快明白》第三讲:php数组
2010/11/01 PHP
PHP面向对象学习之parent::关键字
2017/01/18 PHP
php实现的二分查找算法示例
2017/06/20 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
PHP实现基于3DES算法加密解密字符串示例
2018/08/24 PHP
javascript 清除输入框中的数据
2009/04/13 Javascript
javascript Array对象基础知识小结
2010/11/16 Javascript
jquery不会自动回收xmlHttpRequest对象 导致了内存溢出
2012/06/18 Javascript
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
JavaScript实现的经典文件树菜单效果
2015/09/08 Javascript
jQuery循环遍历子节点并获取值的方法
2016/04/14 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
2016/05/26 Javascript
js验证手机号、密码、短信验证码代码工具类
2020/06/24 Javascript
canvas滤镜效果实现代码
2017/02/06 Javascript
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
2017/12/06 Javascript
vuex进阶知识点巩固
2018/05/20 Javascript
详解vue通过NGINX部署在子目录或者二级目录实践
2018/09/03 Javascript
详解Js里的for…in和for…of的用法
2019/03/28 Javascript
JS实现的tab切换并显示相应内容模块功能示例
2019/08/03 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
Java Varargs 可变参数用法详解
2020/01/28 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
node.js使用http模块创建服务器和客户端完整示例
2020/02/10 Javascript
vue data有值,但是页面{{}} 取不到值的解决
2020/11/09 Javascript
Django admin美化插件suit使用示例
2017/12/12 Python
澳大利亚便宜的家庭购物网站:CrazySales
2018/02/06 全球购物
园长自我鉴定
2013/10/06 职场文书
卫生安全检查制度
2014/02/04 职场文书
人力资源部经理岗位职责规定
2014/02/23 职场文书
秋天的雨教学反思
2014/04/27 职场文书
团干部培训方案
2014/06/03 职场文书
县委常委班子对照检查材料思想汇报
2014/09/28 职场文书
单位工作证明范本
2015/06/15 职场文书
护士旷工检讨书
2015/08/15 职场文书
2016感恩父亲节主题广播稿
2015/12/18 职场文书
Python matplotlib可视化之绘制韦恩图
2022/02/24 Python