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抓取网页正文的源码
Jun 11 Python
Python中的进程分支fork和exec详解
Apr 11 Python
python @property的用法及含义全面解析
Feb 01 Python
python,Django实现的淘宝客登录功能示例
Jun 12 Python
Django urls.py重构及参数传递详解
Jul 23 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
Feb 28 Python
Python标准库json模块和pickle模块使用详解
Mar 10 Python
Python 3.8 新功能来一波(大部分人都不知道)
Mar 11 Python
PyQt5 QDockWidget控件应用详解
Aug 12 Python
用Python进行栅格数据的分区统计和批量提取
May 27 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
Apr 14 Python
python+opencv实现目标跟踪过程
Jun 21 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
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
php 过滤英文标点符号及过滤中文标点符号代码
2014/06/12 PHP
php将html转成wml的WAP标记语言实例
2015/07/08 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
高性能Javascript笔记 数据的存储与访问性能优化
2012/08/02 Javascript
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
jQuery+easyui中的combobox实现下拉框特效
2015/02/27 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
JavaScript中将数组进行合并的基本方法讲解
2016/03/07 Javascript
JS实现图片局部放大或缩小的方法
2016/08/20 Javascript
Angular Module声明和获取重载实例代码
2016/09/14 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
详解webpack4.x之搭建前端开发环境
2019/03/28 Javascript
vue组件开发之slider组件使用详解
2020/08/21 Javascript
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
Python基于select实现的socket服务器
2016/04/13 Python
Python 查看文件的编码格式方法
2017/12/21 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
Pandas之ReIndex重新索引的实现
2019/06/25 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
GDAL 矢量属性数据修改方式(python)
2020/03/10 Python
Python读取二进制文件代码方法解析
2020/06/22 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
python 爬虫之selenium可视化爬虫的实现
2020/12/04 Python
浅谈Selenium 控制浏览器的常用方法
2020/12/04 Python
Why do we need Unit test
2013/01/03 面试题
工作自我评价分享
2013/12/01 职场文书
抽奖活动主持词
2014/03/31 职场文书
房产委托公证书样本
2014/04/04 职场文书
巾帼文明岗申报材料
2014/05/01 职场文书
摄影展策划方案
2014/06/02 职场文书
微笑面对生活演讲稿
2014/09/23 职场文书