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 14 Python
Python打造出适合自己的定制化Eclipse IDE
Mar 02 Python
python实现简单爬虫功能的示例
Oct 24 Python
Python实现网站注册验证码生成类
Jun 08 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
Jan 30 Python
使用Python实现一个栈判断括号是否平衡
Aug 23 Python
对Pandas DataFrame缺失值的查找与填充示例讲解
Nov 06 Python
python学生管理系统开发
Jan 30 Python
python 图片去噪的方法示例
Jul 09 Python
JAVA及PYTHON质数计算代码对比解析
Jun 10 Python
Python模拟键盘输入自动登录TGP
Nov 27 Python
Python基础知识之变量的详解
Apr 14 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
redis 队列操作的例子(php)
2012/04/12 PHP
php结合安卓客户端实现查询交互实例
2015/05/05 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
2016/10/13 PHP
php实时倒计时功能实现方法详解
2017/02/27 PHP
thinkPHP框架实现类似java过滤器的简单方法示例
2018/09/05 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
JS 时间显示效果代码
2009/08/23 Javascript
jquery里的each使用方法详解
2010/12/22 Javascript
json对象转字符串如何实现
2012/12/02 Javascript
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
用js读、写、删除Cookie代码续篇
2014/12/03 Javascript
node.js中的path.delimiter方法使用说明
2014/12/09 Javascript
Bootstrap嵌入jqGrid,使你的table牛逼起来
2016/05/05 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
vue 2.1.3 实时显示当前时间,每秒更新的方法
2018/09/16 Javascript
ES6基础之展开语法(Spread syntax)
2019/02/21 Javascript
小程序云函数调用API接口的方法
2019/05/17 Javascript
vue中v-show和v-if的异同及v-show用法
2019/06/06 Javascript
JS异步处理的进化史深入讲解
2019/08/25 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
js中实现继承的五种方法
2021/01/25 Javascript
python中随机函数random用法实例
2015/04/30 Python
Python Unittest自动化单元测试框架详解
2018/04/04 Python
python写日志文件操作类与应用示例
2019/07/01 Python
Python标准库itertools的使用方法
2020/01/17 Python
Python 识别12306图片验证码物品的实现示例
2020/01/20 Python
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
小学生元旦广播稿
2014/02/21 职场文书
夫妻双方自愿离婚协议书
2014/10/24 职场文书
解除劳动合同通知书范本
2015/04/16 职场文书
学校节水倡议书
2015/04/29 职场文书
刑事辩护词范文
2015/05/21 职场文书
用Python提取PDF表格的方法
2021/04/11 Python