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 29 Python
Python去除列表中重复元素的方法
Mar 20 Python
Python之Scrapy爬虫框架安装及使用详解
Nov 16 Python
Python利用sqlacodegen自动生成ORM实体类示例
Jun 04 Python
Python中的正则表达式与JSON数据交换格式
Jul 03 Python
使用Python进行防病毒免杀解析
Dec 13 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
Feb 22 Python
Django User 模块之 AbstractUser 扩展详解
Mar 11 Python
Python pandas 列转行操作详解(类似hive中explode方法)
May 18 Python
Python 如何批量更新已安装的库
May 26 Python
Python爬虫之Selenium鼠标事件的实现
Dec 04 Python
python前后端自定义分页器
Apr 13 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横向重复区域显示二法
2008/09/25 PHP
php数组函数序列之array_key_exists() - 查找数组键名是否存在
2011/10/29 PHP
destoon实现调用图文新闻的方法
2014/08/21 PHP
thinkPHP下ueditor的使用方法详解
2015/12/26 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
PHP实现一个简单url路由功能实例
2016/11/05 PHP
laravel5.6中的外键约束示例
2019/10/23 PHP
jquery HotKeys轻松搞定键盘事件代码
2008/08/30 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
Node.js中防止错误导致的进程阻塞的方法
2016/08/11 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
JS原型继承四步曲及原型继承图一览
2017/11/28 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
详解JSON Web Token 入门教程
2018/07/30 Javascript
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
js实现录音上传功能
2019/11/22 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
微信小程序实现文件预览
2020/10/22 Javascript
vue-quill-editor插入图片路径太长问题解决方法
2021/01/08 Vue.js
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
用Python制作检测Linux运行信息的工具的教程
2015/04/01 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
Python基于opencv调用摄像头获取个人图片的实现方法
2019/02/21 Python
django多种支付、并发订单处理实例代码
2019/12/13 Python
html5中svg canvas和图片之间相互转化思路代码
2014/01/24 HTML / CSS
Delphi软件工程师试题
2013/01/29 面试题
小学生家长评语集锦
2014/01/30 职场文书
党支部书记岗位责任制
2014/02/11 职场文书
教师国庆节演讲稿范文2014
2014/09/21 职场文书
优秀护士事迹材料
2014/12/25 职场文书
公司内部升职自荐信
2015/03/27 职场文书
撤诉申请书法院范本
2015/05/18 职场文书
探究Mysql模糊查询是否区分大小写
2021/06/11 MySQL
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL
Python函数中的不定长参数相关知识总结
2021/06/24 Python
斗罗大陆八大特殊魂兽,龙族始祖排榜首,第五最残忍(翠魔鸟)
2022/03/18 国漫