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开发之函数定义实例分析
Nov 12 Python
python表格存取的方法
Mar 07 Python
Python之list对应元素求和的方法
Jun 28 Python
Python合并同一个文件夹下所有PDF文件的方法
Mar 11 Python
python实现可变变量名方法详解
Jul 01 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
Dec 23 Python
dpn网络的pytorch实现方式
Jan 14 Python
在django项目中导出数据到excel文件并实现下载的功能
Mar 13 Python
python try...finally...的实现方法
Nov 25 Python
matplotlib bar()实现多组数据并列柱状图通用简便创建方法
Feb 24 Python
浅谈Python numpy创建空数组的问题
May 25 Python
Python 阶乘详解
Oct 05 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
Discuz 5.0 中读取纯真IP数据库函数分析
2007/03/16 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
深入理解JavaScript 闭包究竟是什么
2013/04/12 Javascript
单击复制文字兼容各浏览器的完美解决方案
2013/07/04 Javascript
原生JS和JQuery动态添加、删除表格行的方法
2015/05/28 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
2016/06/16 Javascript
浅谈JS中String()与 .toString()的区别
2016/10/20 Javascript
JS实现最简单的冒泡排序算法
2017/02/15 Javascript
JavaScript无阻塞加载和defer、async详解
2017/02/26 Javascript
select标签设置默认选中的选项方法
2018/03/02 Javascript
jQuery实现列表的增加和删除功能
2018/06/14 jQuery
微信小程序支付前端源码
2018/08/29 Javascript
深入学习JavaScript 高阶函数
2019/06/11 Javascript
实现vuex与组件data之间的数据同步更新方式
2019/11/12 Javascript
Vue中函数防抖节流的理解及应用实现
2020/04/24 Javascript
JavaScript 判断浏览器是否是IE
2021/02/19 Javascript
python创建只读属性对象的方法(ReadOnlyObject)
2013/02/10 Python
python 简单的多线程链接实现代码
2016/08/28 Python
python3使用SMTP发送简单文本邮件
2018/06/19 Python
Python符号计算之实现函数极限的方法
2019/07/15 Python
Django Session和Cookie分别实现记住用户登录状态操作
2020/07/02 Python
Django mysqlclient安装和使用详解
2020/09/17 Python
美国最大的电子宠物训练产品制造商:PetSafe
2018/10/12 全球购物
雷蛇美国官网:Razer
2020/04/03 全球购物
大堂副理的岗位职责范文
2014/02/17 职场文书
党的群众路线教育实践活动心得体会
2014/03/03 职场文书
2014年五一劳动节社区活动总结
2014/04/14 职场文书
大学生交通专业求职信
2014/09/01 职场文书
音乐教师求职信范文
2015/03/20 职场文书
运动会运动员赞词
2015/07/22 职场文书
毕业酒会致辞
2015/07/29 职场文书
2016年“节能宣传周”活动总结
2016/04/05 职场文书
python机器学习Github已达8.9Kstars模型解释器LIME
2021/11/23 Python
Python OpenCV形态学运算示例详解
2022/04/07 Python
Oracle数据库事务的开启与结束详解
2022/06/25 Oracle
Win10加载疑难解答时出错发生意外错误的解决方法
2022/07/07 数码科技