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装饰器
Jul 27 Python
python flask 多对多表查询功能
Jun 25 Python
解决新django中的path不能使用正则表达式的问题
Dec 18 Python
python+opencv实现高斯平滑滤波
Jul 21 Python
python如何实现异步调用函数执行
Jul 08 Python
Pytorch模型转onnx模型实例
Jan 15 Python
pytorch 修改预训练model实例
Jan 18 Python
基于python求两个列表的并集.交集.差集
Feb 10 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
Feb 26 Python
python基于selenium爬取斗鱼弹幕
Feb 20 Python
python实现Thrift服务端的方法
Apr 20 Python
python pandas 解析(读取、写入)CSV 文件的操作方法
Dec 24 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生成缩略图的代码
2011/01/12 PHP
PHP echo,print,printf,sprintf函数之间的区别与用法详解
2013/11/27 PHP
PHP按行读取文件时删除换行符的3种方法
2014/05/04 PHP
php实现监控varnish缓存服务器的状态
2014/12/30 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
2015/05/12 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
php实时倒计时功能实现方法详解
2017/02/27 PHP
Laravel学习教程之路由模块
2017/08/18 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
用jquery方法操作radio使其默认选项是否
2013/09/10 Javascript
Js获取数组最大和最小值示例代码
2013/10/29 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
2015/10/08 Javascript
JavaScript几种数组去掉重复值的方法推荐
2016/04/12 Javascript
Angular.JS去掉访问路径URL中的#号详解
2017/03/30 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
2017/08/25 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
Python 生成一个从0到n个数字的列表4种方法小结
2019/11/28 Python
python 基于PYMYSQL使用MYSQL数据库
2020/12/24 Python
10个很棒的 CSS3 开发工具 推荐
2011/05/16 HTML / CSS
MAC Cosmetics官方网站:魅可专业艺术彩妆
2019/04/10 全球购物
2019年c语言经典面试题目
2016/08/17 面试题
电气自动化自荐信
2013/10/10 职场文书
电脑销售顾问自荐信
2014/01/29 职场文书
《哪吒闹海》教学反思
2014/02/28 职场文书
群众路线教育实践活动剖析材料
2014/09/30 职场文书
开会通知
2015/04/20 职场文书
小学同学聚会感言
2015/07/30 职场文书
励志语录:时光飞逝,请学会珍惜所有的人和事
2020/01/16 职场文书
CSS几步实现赛博朋克2077风格视觉效果
2021/06/16 HTML / CSS
Window server中安装Redis的超详细教程
2021/11/17 Redis
Redis中key的过期删除策略和内存淘汰机制
2022/04/12 Redis
Mongodb 迁移数据块的流程介绍分析
2022/04/18 MongoDB
教你使用Ubuntu搭建DNS服务器
2022/09/23 Servers