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入门篇之编程习惯与特点
Oct 17 Python
Python实现批量检测HTTP服务的状态
Oct 27 Python
解决PyCharm中光标变粗的问题
Aug 05 Python
Django中redis的使用方法(包括安装、配置、启动)
Feb 21 Python
Python实现的json文件读取及中文乱码显示问题解决方法
Aug 06 Python
基于Python安装pyecharts所遇的问题及解决方法
Aug 12 Python
关于numpy.where()函数 返回值的解释
Dec 06 Python
Python实现CNN的多通道输入实例
Jan 17 Python
Django自定义全局403、404、500错误页面的示例代码
Mar 08 Python
Pycharm安装Qt Design快捷工具的详细教程
Nov 18 Python
python数据分析之用sklearn预测糖尿病
Apr 22 Python
Django migrate报错的解决方案
May 20 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 身份证号验证函数
2009/05/07 PHP
PHP在不同页面间传递Json数据示例代码
2013/06/08 PHP
php实现通过ftp上传文件
2015/06/19 PHP
降低PHP Redis内存占用
2017/03/23 PHP
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
JavaScript中常用的运算符小结
2012/01/18 Javascript
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
jquery应该如何来设置改变按钮input的onclick事件
2012/12/10 Javascript
javascript简单性能问题及学习笔记
2014/02/04 Javascript
使用jQuery实现星级评分代码分享
2014/12/09 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
2016/06/07 Javascript
javascript工厂模式和构造函数模式创建对象方法解析
2016/12/30 Javascript
NodeJS 实现手机短信验证模块阿里大于功能
2017/06/19 NodeJs
JavaScript实现百度搜索框效果
2020/03/26 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
JavaScript如何操作css
2020/10/24 Javascript
解决antd Form 表单校验方法无响应的问题
2020/10/27 Javascript
使用Python的Zato发送AMQP消息的教程
2015/04/16 Python
整理Python中的赋值运算符
2015/05/13 Python
12步教你理解Python装饰器
2016/02/25 Python
Python tkinter三种布局实例详解
2020/01/06 Python
python 下划线的不同用法
2020/10/24 Python
梅西百货官网:Macy’s
2020/08/04 全球购物
广州一家公司的.NET面试题
2016/06/11 面试题
保险经纪人求职信
2014/03/11 职场文书
迎新晚会策划方案
2014/06/13 职场文书
2014年学校财务工作总结
2014/12/06 职场文书
2014小学数学教师个人工作总结
2014/12/18 职场文书
装饰技术负责人岗位职责
2015/04/13 职场文书
老员工辞职信范文
2015/05/12 职场文书
《大禹治水》教学反思
2016/02/22 职场文书
Nginx配置并兼容HTTP实现代码解析
2021/03/31 Servers
python如何做代码性能分析
2021/04/26 Python
Python办公自动化解决world文件批量转换
2021/09/15 Python