python爬虫_微信公众号推送信息爬取的实例


Posted in Python onOctober 23, 2017

问题描述

利用搜狗的微信搜索抓取指定公众号的最新一条推送,并保存相应的网页至本地。

注意点

搜狗微信获取的地址为临时链接,具有时效性。

公众号为动态网页(JavaScript渲染),使用requests.get()获取的内容是不含推送消息的,这里使用selenium+PhantomJS处理

代码

#! /usr/bin/env python3
from selenium import webdriver
from datetime import datetime
import bs4, requests
import os, time, sys

# 获取公众号链接
def getAccountURL(searchURL):
 res = requests.get(searchURL)
 res.raise_for_status()
 soup = bs4.BeautifulSoup(res.text, "lxml")
 # 选择第一个链接
 account = soup.select('a[uigs="account_name_0"]')
 return account[0]['href']

# 获取首篇文章的链接,如果有验证码返回None
def getArticleURL(accountURL):
 browser = webdriver.PhantomJS("/Users/chasechoi/Downloads/phantomjs-2.1.1-macosx/bin/phantomjs")
 # 进入公众号
 browser.get(accountURL)
 # 获取网页信息
 html = browser.page_source
 accountSoup = bs4.BeautifulSoup(html, "lxml")
 time.sleep(1)
 contents = accountSoup.find_all(hrefs=True)
 try:
  partitialLink = contents[0]['hrefs']
  firstLink = base + partitialLink
 except IndexError:
  firstLink = None 
  print('CAPTCHA!')
 return firstLink

# 创建文件夹存储html网页,以时间命名
def folderCreation():
 path = os.path.join(os.getcwd(), datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
 try:
  os.makedirs(path)
 except OSError as e:
  if e.errno != errno.EEXIST:
   raise
  print("folder not exist!")
 return path

# 将html页面写入本地
def writeToFile(path, account, title):
 myfile = open("{}/{}_{}.html".format(path, account, title), 'wb')
 myfile.write(res.content)
 myfile.close()

base ='https://mp.weixin.qq.com'
accountList = ['央视新闻', '新浪新闻','凤凰新闻','羊城晚报']
query = 'http://weixin.sogou.com/weixin?type=1&s_from=input&query='

path = folderCreation()

for index, account in enumerate(accountList):
 searchURL = query + account
 accountURL = getAccountURL(searchURL)
 time.sleep(10)
 articleURL = getArticleURL(accountURL)
 if articleURL != None:
  print("#{}({}/{}): {}".format(account, index+1, len(accountList), accountURL))
  # 读取第一篇文章内容
  res = requests.get(articleURL)
  res.raise_for_status()
  detailPage = bs4.BeautifulSoup(res.text, "lxml")
  title = detailPage.title.text
  print("标题: {}\n链接: {}\n".format(title, articleURL))
  writeToFile(path, account, title)
 else:
  print('{} files successfully written to {}'.format(index, path))
  sys.exit()

print('{} files successfully written to {}'.format(len(accountList), path))

参考输出

Terminal输出

python爬虫_微信公众号推送信息爬取的实例

Finder

python爬虫_微信公众号推送信息爬取的实例

分析

链接获取

首先进入搜狗的微信搜索页面,在地址栏中提取需要的部分链接,字符串连接公众号名称,即可生成请求链接

针对静态网页,利用requests获取html文件,再用BeautifulSoup选择需要的内容

针对动态网页,利用selenium+PhantomJS获取html文件,再用BeautifulSoup选择需要的内容

遇到验证码(CAPTCHA),输出提示。此版本代码没有对验证码做实际处理,需要人为访问后,再跑程序,才能避开验证码。

文件写入

使用os.path.join()构造存储路径可以提高通用性。比如Windows路径分隔符使用back slash(\), 而OS X 和 Linux使用forward slash(/),通过该函数能根据平台进行自动转换。

open()使用b(binary mode)参数同样为了提高通用性(适应Windows)

使用datetime.now()获取当前时间进行命名,并通过strftime()格式化时间(函数名中的f代表format),

具体使用参考下表(摘自 Automate the Boring Stuff with Python)

python爬虫_微信公众号推送信息爬取的实例

以上这篇python爬虫_微信公众号推送信息爬取的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python解析中国天气网的天气数据
Mar 21 Python
深入理解python对json的操作总结
Jan 05 Python
tensorflow构建BP神经网络的方法
Mar 12 Python
Python实现自定义函数的5种常见形式分析
Jun 16 Python
Python 调用PIL库失败的解决方法
Jan 08 Python
关于python之字典的嵌套,递归调用方法
Jan 21 Python
对Python3之进程池与回调函数的实例详解
Jan 22 Python
Django 全局的static和templates的使用详解
Jul 19 Python
实例详解Python装饰器与闭包
Jul 29 Python
python 生成器和迭代器的原理解析
Oct 12 Python
使用python3批量下载rbsp数据的示例代码
Dec 20 Python
Python读写操作csv和excle文件代码实例
Mar 16 Python
Python 模拟员工信息数据库操作的实例
Oct 23 #Python
Scrapy爬虫实例讲解_校花网
Oct 23 #Python
Python学习笔记之if语句的使用示例
Oct 23 #Python
Django实现快速分页的方法实例
Oct 22 #Python
python使用SMTP发送qq或sina邮件
Oct 21 #Python
python爬虫headers设置后无效的解决方法
Oct 21 #Python
Python 结巴分词实现关键词抽取分析
Oct 21 #Python
You might like
PHP实现定时生成HTML网站首页实例代码
2008/11/20 PHP
php建立Ftp连接的方法
2015/03/07 PHP
PHP环境中Memcache的安装和使用
2015/11/05 PHP
php实现转换html格式为文本格式的方法
2016/05/16 PHP
php事件驱动化设计详解
2016/11/10 PHP
php实现多维数组排序的方法示例
2017/03/23 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
2017/10/22 PHP
Thinkphp 框架扩展之类库扩展操作详解
2020/04/23 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
原生js实现图片放大缩小计时器效果
2017/01/20 Javascript
JavaScript的继承实现小结
2017/05/07 Javascript
vuex的使用及持久化state的方式详解
2018/01/23 Javascript
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
详解小程序循环require之坑
2019/03/08 Javascript
原生js实现下拉选项卡
2019/11/27 Javascript
Python实现的简单发送邮件脚本分享
2014/11/07 Python
Java中重定向输出流实现用文件记录程序日志
2015/06/12 Python
浅谈python为什么不需要三目运算符和switch
2016/06/17 Python
Python使用Django实现博客系统完整版
2020/09/29 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
2018/04/19 Python
TensorFlow的权值更新方法
2018/06/14 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
2020/06/02 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
2021/03/04 Python
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
Cotton On南非:澳洲时尚平价品牌
2018/06/28 全球购物
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2014/07/21 面试题
财务会计专业求职信范文
2013/12/31 职场文书
文明学生事迹材料
2014/01/29 职场文书
竞选部门副经理的自荐书范文
2014/02/11 职场文书
工艺工程师岗位职责
2014/03/04 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
统招统分证明
2015/06/23 职场文书
分析Netty直接内存原理及应用
2021/06/14 Java/Android