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 10 Python
django 外键model的互相读取方法
Dec 15 Python
值得收藏的10道python 面试题
Apr 15 Python
Python 把序列转换为元组的函数tuple方法
Jun 27 Python
python将字符串转换成json的方法小结
Jul 09 Python
numpy中三维数组中加入元素后的位置详解
Nov 28 Python
500行python代码实现飞机大战
Apr 24 Python
基于Python绘制个人足迹地图
Jun 01 Python
python初步实现word2vec操作
Jun 09 Python
浅析Python __name__ 是什么
Jul 07 Python
python opencv pytesseract 验证码识别的实现
Aug 28 Python
python 基于opencv去除图片阴影
Jan 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
关于svn冲突的解决方法
2013/06/21 PHP
PHP中include和require的区别实例分析
2017/05/07 PHP
JQUERY 对象与DOM对象之两者相互间的转换
2009/04/27 Javascript
JavaScript的单例模式 (singleton in Javascript)
2010/06/11 Javascript
javascript 45种缓动效果 非常酷
2011/06/28 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
JavaScript中三种异步上传文件方式
2016/03/06 Javascript
JavaScript数值千分位格式化的两种简单实现方法
2016/08/01 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
JavaScript创建对象的七种方式(推荐)
2017/06/26 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
详解微信小程序中组件通讯
2018/10/30 Javascript
javascript将16进制的字符串转换为10进制整数hex
2020/03/05 Javascript
vue实现移动端input上传视频、音频
2020/08/18 Javascript
[04:26]DOTA2上海特锦赛小组赛第二日 TOP10精彩集锦
2016/02/27 DOTA
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python实现遍历数据库并获取key的值
2015/05/17 Python
Python判断两个对象相等的原理
2017/12/12 Python
对python中的float除法和整除法的实例详解
2019/07/20 Python
Python unittest discover批量执行代码实例
2020/09/08 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
美国零售商店:Blue&Cream
2017/04/07 全球购物
Bealls Florida百货商店:生活服饰、家居装饰和鞋子
2018/02/23 全球购物
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
美国山地自行车、露营、户外装备和服装购物网站:Aventuron
2018/05/05 全球购物
澳大利亚Mocha官方网站:包、钱包、珠宝和配饰
2019/07/18 全球购物
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
推广普通话演讲稿
2014/05/23 职场文书
付款承诺函范文
2015/01/21 职场文书
运动会宣传语
2015/07/13 职场文书
电力培训学习心得体会
2016/01/11 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
Python机器学习之KNN近邻算法
2021/05/14 Python