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之有容乃大的list(3)
Sep 15 Python
Python用imghdr模块识别图片格式实例解析
Jan 11 Python
Python 查找list中的某个元素的所有的下标方法
Jun 27 Python
python的sorted用法详解
Jun 25 Python
python pytest进阶之fixture详解
Jun 27 Python
python pandas生成时间列表
Jun 29 Python
Python 的字典(Dict)是如何存储的
Jul 05 Python
详解pyinstaller selenium python3 chrome打包问题
Oct 18 Python
Python中xml和dict格式转换的示例代码
Nov 07 Python
Python合并2个字典成1个新字典的方法(9种)
Dec 19 Python
Python turtle编写简单的球类小游戏
Mar 31 Python
Python 图片添加美颜效果
Apr 28 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
Codeigniter检测表单post数据的方法
2015/03/21 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
2018/03/30 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
javascript String 的扩展方法集合
2008/06/01 Javascript
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
一个仿糯米弹框效果demo
2014/07/22 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
js与jQuery实现的用户注册协议倒计时功能实例【三种方法】
2017/11/09 jQuery
详解vue-cli 接口代理配置
2017/12/13 Javascript
bootstrap中的导航条实例代码详解
2019/05/20 Javascript
原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】
2019/08/15 Javascript
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
Python解析树及树的遍历
2016/02/03 Python
利用Python开发实现简单的记事本
2016/11/15 Python
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
python2.6.6如何升级到python2.7.14
2018/04/08 Python
Python交互环境下实现输入代码
2018/06/22 Python
Python2包含中文报错的解决方法
2018/07/09 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
2018/07/13 Python
Python chardet库识别编码原理解析
2020/02/18 Python
将不规则的Python多维数组拉平到一维的方法实现
2021/01/11 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
CSS代码检查工具stylelint的使用方法详解
2021/03/27 HTML / CSS
综合测评自我鉴定
2013/10/08 职场文书
机械专业技术员求职信
2014/06/14 职场文书
高校自主招生自荐信2015
2015/03/04 职场文书
2015年项目经理工作总结
2015/04/30 职场文书
2016党员学习心得体会范文
2016/01/23 职场文书
Mysql 如何批量插入数据
2021/04/06 MySQL
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python
Tomcat配置访问日志和线程数
2022/05/06 Servers
解决Oracle数据库用户密码过期
2022/05/11 Oracle