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动态加载模块的3种方法
Nov 22 Python
Python转换HTML到Text纯文本的方法
Jan 15 Python
python编码总结(编码类型、格式、转码)
Jul 01 Python
python中实现精确的浮点数运算详解
Nov 02 Python
numpy自动生成数组详解
Dec 15 Python
python实现自动解数独小程序
Jan 21 Python
详解python函数的闭包问题(内部函数与外部函数详述)
May 17 Python
简单分析python的类变量、实例变量
Aug 23 Python
使用IDLE的Python shell窗口实例详解
Nov 19 Python
python socket通信编程实现文件上传代码实例
Dec 14 Python
解决pycharm导入numpy包的和使用时报错:RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的问题
Dec 08 Python
python用海龟绘图写贪吃蛇游戏
Jun 18 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
Terran剧情介绍
2020/03/14 星际争霸
整合了前面的PHP数据库连接类~~做成一个分页类!
2006/11/25 PHP
PHP闭包(Closure)使用详解
2013/05/02 PHP
php实现的微信红包算法分析(非官方)
2015/09/25 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
laravel 5.4中实现无限级分类的方法示例
2017/07/27 PHP
JavaScript 函数惰性载入的实现及其优点介绍
2013/08/12 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
2013/12/13 Javascript
Javascript添加监听与删除监听用法详解
2014/12/19 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
基于JavaScript代码实现自动生成表格
2016/06/15 Javascript
javascript轮播图算法
2016/10/21 Javascript
详解升级react-router 4 踩坑指南
2017/08/14 Javascript
基于Swiper实现移动端页面图片轮播效果
2017/12/28 Javascript
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
小程序云开发实战小结
2018/10/25 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
2019/05/09 Javascript
Nodejs封装类似express框架的路由实例详解
2020/01/05 NodeJs
JS实现随机点名器
2020/04/12 Javascript
VueJS实现用户管理系统
2020/05/29 Javascript
python创建和删除目录的方法
2015/04/29 Python
Python基于scapy实现修改IP发送请求的方法示例
2017/07/08 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
英国领先的体验日提供商:Buyagift
2019/04/19 全球购物
元旦晚会主持词
2014/03/24 职场文书
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
节能环保标语
2014/06/12 职场文书
保洁员岗位职责
2015/02/04 职场文书
2015年感恩父亲节活动策划方案
2015/05/05 职场文书
工作收入证明模板
2015/06/12 职场文书
MySQL悲观锁与乐观锁的实现方案
2021/11/02 MySQL
优化Mysql查询的示例
2022/04/26 MySQL