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抓取百度首页的方法
May 19 Python
Python时间模块datetime、time、calendar的使用方法
Jan 13 Python
python如何获取服务器硬件信息
May 11 Python
sublime text 3配置使用python操作方法
Jun 11 Python
使用Django Form解决表单数据无法动态刷新的两种方法
Jul 14 Python
获取Django项目的全部url方法详解
Oct 26 Python
Python cookbook(数据结构与算法)从字典中提取子集的方法示例
Mar 22 Python
python多进程使用及线程池的使用方法代码详解
Oct 24 Python
Python判断一个文件夹内哪些文件是图片的实例
Dec 07 Python
使用Python函数进行模块化的实现
Nov 15 Python
Python实现平行坐标图的绘制(plotly)方式
Nov 22 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
Jan 16 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/02/03 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
Yii框架视图、视图布局、视图数据块操作示例
2019/10/14 PHP
用js自动判断浏览器分辨率的代码
2007/01/28 Javascript
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
2013/01/21 Javascript
javascript 函数及作用域总结介绍
2013/11/12 Javascript
jquery validate在ie8下的bug解决方法
2013/11/13 Javascript
Javascript实现鼠标右键特色菜单
2015/08/04 Javascript
详解AngularJS中ng-src指令的使用
2016/09/07 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
javascript DOM的详解及实例代码
2017/03/06 Javascript
Mongoose中document与object的区别示例详解
2017/09/18 Javascript
javascript填充默认头像方法
2018/02/22 Javascript
使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)
2018/05/01 Javascript
用图片替换checkbox原始样式并实现同样的功能
2018/11/15 Javascript
在vue中使用setInterval的方法示例
2019/04/16 Javascript
vue实现pdf文档在线预览功能
2019/11/26 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
js实现圆形显示鼠标单击位置
2020/02/11 Javascript
javascript canvas API内容整理
2020/02/16 Javascript
jQuery+ajax实现文件上传功能
2020/12/22 jQuery
js中实现继承的五种方法
2021/01/25 Javascript
python中快速进行多个字符替换的方法小结
2016/12/15 Python
Python判断对象是否相等及eq函数的讲解
2019/02/25 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
Python reversed反转序列并生成可迭代对象
2020/10/22 Python
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
硕士研究生个人求职信
2013/12/04 职场文书
纺织工程专业个人求职信范文
2014/01/27 职场文书
自我鉴定总结
2014/03/24 职场文书
印刷技术专业自荐信
2014/09/18 职场文书
中学生运动会新闻稿
2014/09/24 职场文书
简单的辞职信怎么写
2015/02/28 职场文书