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 相关文章推荐
破解安装Pycharm的方法
Oct 19 Python
python3实现指定目录下文件sha256及文件大小统计
Feb 25 Python
python日志logging模块使用方法分析
May 23 Python
详解python中__name__的意义以及作用
Aug 07 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
Oct 01 Python
wxpython+pymysql实现用户登陆功能
Nov 19 Python
Python代码生成视频的缩略图的实例讲解
Dec 22 Python
python标识符命名规范原理解析
Jan 10 Python
jupyter notebook中美观显示矩阵实例
Apr 17 Python
深入理解Python 多线程
Jun 16 Python
如何利用python生成MD5并去重
Dec 07 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
Feb 25 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
全新的PDO数据库操作类php版(仅适用Mysql)
2012/07/22 PHP
PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)的详解
2013/07/03 PHP
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
DEDECMS首页调用图片集里的多张图片
2015/06/05 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
List all the Databases on a SQL Server
2007/06/21 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
node.js中实现同步操作的3种实现方法
2014/12/05 Javascript
浅谈JavaScript超时调用和间歇调用
2015/08/30 Javascript
举例讲解jQuery对DOM元素的向上遍历、向下遍历和水平遍历
2016/07/07 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
2016/12/27 Javascript
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
Python3中的json模块使用详解
2018/05/05 Python
Python3之简单搭建自带服务器的实例讲解
2018/06/04 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
python json.loads兼容单引号数据的方法
2018/12/19 Python
python队列原理及实现方法示例
2019/11/27 Python
postman和python mock测试过程图解
2020/02/22 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
从一次项目重构说起CSS3自定义变量在项目的使用方法
2021/03/01 HTML / CSS
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
全球虚拟主机商:HostGator
2017/02/06 全球购物
大型会议接待方案
2014/03/01 职场文书
益达广告词
2014/03/14 职场文书
行政内勤岗位职责
2014/04/07 职场文书
道路交通事故人身损害赔偿协议书
2014/11/19 职场文书
2014年销售内勤工作总结
2014/12/01 职场文书
初中班干部工作总结
2015/08/10 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
python生成随机数、随机字符、随机字符串
2021/04/06 Python
Python+Appium新手教程
2021/04/17 Python
我收到了德劲DE1107
2022/04/05 无线电
Spring Cloud OAuth2实现自定义token返回格式
2022/06/25 Java/Android