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 30 Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
深入理解Python 关于supper 的 用法和原理
Feb 28 Python
Python简单实现的代理服务器端口映射功能示例
Apr 08 Python
Flask框架Jinjia模板常用语法总结
Jul 19 Python
python同时遍历数组的索引和值的实例
Nov 15 Python
django 实现编写控制登录和访问权限控制的中间件方法
Jan 15 Python
Python实现的在特定目录下导入模块功能分析
Feb 11 Python
Python叠加两幅栅格图像的实现方法
Jul 05 Python
python TK库简单应用(实时显示子进程输出)
Oct 29 Python
详解Python设计模式之策略模式
Jun 15 Python
python和Appium的移动端多设备自动化测试框架
Apr 26 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
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
php 函数使用方法与函数定义方法
2010/05/09 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
2016/04/07 PHP
用于table内容排序
2006/07/21 Javascript
js ondocumentready onmouseover onclick onmouseout 样式
2010/07/22 Javascript
Function.prototype.bind用法示例
2013/09/16 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
JQuery记住用户名和密码的具体实现
2014/04/04 Javascript
探讨js字符串数组拼接的性能问题
2014/10/11 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
JS实现队列的先进先出功能示例
2017/05/10 Javascript
Vue axios 中提交表单数据(含上传文件)
2017/07/06 Javascript
基于Vue实例生命周期(全面解析)
2017/08/16 Javascript
使用svg实现动态时钟效果
2018/07/17 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
2019/06/07 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
python和bash统计CPU利用率的方法
2015/07/10 Python
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
2018/06/14 Python
python爬虫之自动登录与验证码识别
2020/06/15 Python
python中import与from方法总结(推荐)
2019/03/21 Python
Django 创建/删除用户的示例代码
2019/07/24 Python
python实现LRU热点缓存及原理
2019/10/29 Python
python进程的状态、创建及使用方法详解
2019/12/06 Python
python 列表推导和生成器表达式的使用
2021/02/01 Python
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
办公室保洁员岗位职责
2013/12/02 职场文书
会计实习自我鉴定
2013/12/04 职场文书
劳动竞赛口号
2014/06/16 职场文书
党的群众路线教育实践活动教师自我剖析材料
2014/10/09 职场文书
你对自己的信用报告有过了解吗?
2019/07/09 职场文书
小米11和iphone12哪个值得买?小米11对比iphone12评测
2021/04/21 数码科技