python搜索关键词的公众号文章标题和路径_微信文章关键词爬虫教程
前言:全文已在个人网站发布:微信文章关键词爬虫教程
这是一个爬虫 Demo, 主要通过 Python 中的 urllib 库完成微信文章关键词爬虫,根据传入特定的关键词,爬取:搜狗|微信 的公众号文章,并且可以自定义爬取特定关键字的所在页面范围的文章。对链接的爬取主要通过 Regular Expression(RE) 完成,如果对正则表达式方面有疑问也没关系,我将最近写篇详细的正则的文章以供参考。
代码:
# -*- coding: utf-8 -*-
# 微信公众号文章爬虫
# Usage: 在get_all_article_url(keyword,start,end)提供需要查找的关键字、搜索的起始页和结束页,未使用proxy,如果爬取大量页面存在屏蔽风险
# 所有的/Users/rundouble/Desktop/为我自己的PC路径,运行需根据自己的路径进行修改
# TODO: proxy
import re
import urllib.request
import urllib.error
import time
headers = ('User-Agent', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36')
opener = urllib.request.build_opener()
opener.addheaders = [headers]
urllib.request.install_opener(opener)
# 用来存储所有的查找文章的链接
list_url = []
# k用来作为存储文章html文件的文件名
k = 'Default_Name'
# 根据url,返回源代码
def get_source(url):
try:
data = urllib.request.urlopen(url).read().decode('utf-8')
return data
except urllib.error.URLError as e:
if hasattr(e,'code'):
print(e.code)
if hasattr(e,'reason'):
print(e.reason)
time.sleep(3)
except Exception as e:
print('Exception:'+str(e))
time.sleep(1)
# 根据关键字、起始页和结束页,爬取所有该关键字的公众号文章的链接
def get_all_article_url(key, start, end):
try:
global k
k = key
keycode = urllib.request.quote(key)
pagecode = urllib.request.quote('&page')
# 构建文章目录网址
for page in range(start, end+1):
# 记得type参数,type=2表示文章,不写type为公众号
url = 'http://weixin.sogou.com/weixin?query='+keycode+'&type=2'+'&page='+str(page)
data1 = get_source(url)
# .*?是懒惰模式,并且该pattern最后的字符是一个双引号,只是获得()url内容
listurl_pat = '
# 使用预编译可以将整个文本中所有满足模式的链接提取出来,以列表形式存储
list_url.append(re.compile(listurl_pat, re.S).findall(data1))
print('Total articles\'url size:'+str(len(list_url))+'个')
for url in list_url:
print(url)
return list_url
except urllib.error.URLError as e:
if hasattr(e,'code'):
print(e.code)
if hasattr(e, 'reason'):
print(e.reason)
time.sleep(3)
except Exception as e:
print("Exception:"+str(e))
time.sleep(1)
# 根据需要查找的公众号文章的url,爬取文章内容
def get_content(list_url):
head_html = '''
爬取的微信文章简易展示'''
fhandle = open('/Users/rundouble/Desktop/'+k+'.html', 'wb')
fhandle.write(head_html.encode('utf-8'))
fhandle.close()
# 遍历list_url(二维表)
for i in range(0, len(list_url)):
for j in range(0, len(list_url[i])):
try:
# trim article url
url = list_url[i][j]
print(url)
url = url.replace('amp;', '')
data = get_source(url)
title_pat = '
(.*?)'
content_pat = 'id="js_content">(.*?)id="js_sg_bar">'
title = re.compile(title_pat).findall(data)
content = re.compile(content_pat,re.S).findall(data)
this_title = 'No title'
this_content = 'No content'
if title:
this_title = title[0]
if content:
this_content = content[0]
article_data = '
'+this_title+'
'+'
'+this_content+'
'
fhandle = open('/Users/rundouble/Desktop/'+k+'.html', 'ab')
fhandle.write(article_data.encode('utf-8'))
fhandle.close()
print('第'+str(i)+'个页面,第'+str(j)+'个文章正在写入。')
except urllib.error.URLError as e:
if hasattr(e, 'code'):
print(e.code)
if hasattr(e, 'reason'):
print(e.reason)
time.sleep(3)
except Exception as e:
print('Exception:'+str(e))
time.sleep(1)
fhandle.close()
foot_html = ''
fhandle = open('/Users/rundouble/Desktop/'+k+'.html','ab')
fhandle.write(foot_html.encode('utf-8'))
fhandle.close()
list_url = get_all_article_url('知乎›', 1, 2)
get_content(list_url)
结果:
将所有爬取的文章存储在以搜索关键字为名字的html文件中,比如,我以“知乎”为关键字,运行后,会有一个“知乎.html”的文件,打开:
思路:
在 微信|搜狗 可以搜索微信公众号和微信公众号文章,本教程只做文章的爬虫。当我们输入关键字“知乎”的时候,根据对比搜索时的网址URL发现
type=2表示搜索文章,不写 type默认查找的是公众号
query的值是要搜索的关键字,但由于是经过编码处理,所以在程序中要使用quote()方法对关键字进行utf-8的处理
这样就构建好搜索时的URL模板,不同的关键字搜索只需要更改query的值就可以。
当我们跳转搜索结果的第二页再次观察URL
这时增加了两个字段,一个是ie,代表编码格式,可以不管它。另一个是page=2,不难发现是控制搜索页的页数。
当我们搜索关键字时,进入预览页
这时需要获得当前页的所有的文章的链接,观察源代码
发现每篇文章的链接都是以
在进入每篇具体的文章页面时,再次观察源码
找到文章标题所在的
标签,使用正则表达式:(.*?) 提取标题。
最后提取文章正文,这个正文是包含一些样式的,把整个文章的爬取出来
以id="js_content"开头,以 id="js_sg_bar" 结尾的之间的内容为文章的全文信息,使用正则表达式:id="js_content">(.*?)id="js_sg_bar"> 。最后通过构建一个简易的h5的文件,将文章的标题和文章内容填入进去,done.
主要通过三个方法实现:第一个是get_resource(url),传入URL,返回网页的源码
第二个是get_all_article_url(key, start, end) 传入关键字、起始页、结束页,返回范围内的文章的URL
第三个是get_content(list_url) 传入文章的URL列表,这个列表是二维的,因为每行代表每个搜索页的文章的URL列表,因为有多个搜索页面,所以实质上是二维表,该方法返回完成文章内容的爬取
改进:如果大批量爬取微信公众号文章会造成IP被封的可能,所以可以使用proxy,为程序使用代理,避免屏蔽
另一方面,在爬取文章的内容存储时候,可以把h5的样式调整,以更加优雅的方式呈现
采用多线程方式爬取
注:参考《精通Python网络爬虫》
python搜索关键词的公众号文章标题和路径_微信文章关键词爬虫教程相关推荐
- 微信公众号怎么推送消息_微信公众号发送消息
A.模板消息发送 模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等.不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息. 备注 ...
- 微信公众号回复服务器参数错误,为什么微信文章网址在浏览器访问提示参数错误...
有客户反映,孤狼公众号助手采集到的文章,发布到数据库里,复制数据库里的文章url,在浏览器打开,显示"参数错误"如图: 这样显示,初步判断为,URL参数输入错误了,那么到底哪里错误 ...
- 微信公众号发送小程序卡片_微信公众号群发文章支持添加小程序卡片
2017年4月20日微信发布公告称,微信公众平号群发文章支持添加小程序功能,这对于推广小程序来说,无疑是不错的途径.那么微信公众号群发文章怎么添加小程序?下面爱站技术频道的小编带来的详细教程. 微信公 ...
- Chrome插件英雄榜110篇更新!《微信公众号同步助手》快速将微信文章同步到知乎B站等创作平台...
title: 110 <微信公众号同步助手>是一款将微信文章同步到知乎, B站,微博,豆瓣,百家号, 简书, 头条号,搜狐号, 大鱼号, 一点资讯, Cnblog, CSDN, 51CTO ...
- 微信公众号发送小程序卡片_微信公众号里怎么添加小程序-如何在微信[[公众号]]添加小程序卡片-微信关联小程序...
参考官方Demo 1.进入公众号,选择「关联小程序」后,微信公众号运营者用手机扫码进行认证,并输入小程序的AppID即可. 2.腾讯地图+小程序appID:wx7643d5f831302ab0 3. ...
- 公众号怎么设置滑动文字_微信公众号滑动文字怎么制作内容呢?
微信公众号滑动文字怎么制作内容呢?如今手机的普及性,微信这个有代表性的即时通讯软件也在大家中间应用广泛,于是有了各种各样的微信公众号,今天下不为大家整理的是微信公众号滑动文字怎么弄的内容! 微信公众号 ...
- 分享公众号预约系统怎么做_微信公众号制作线上预约系统步骤
现如今预约专家.预定商品都可以通过微信等社交软件来实现,不再需要我们打电话或者亲自到店咨询了,实现微信预约功能,有很多种方式,目前主流的实现方法是通过微信公众号或者小程序制作的. 编辑 那么微信公众号 ...
- 微信公众号发送小程序卡片_微信公众号将能够直接给用户推送小程序卡片,社交电商开始发力...
公众号或能在对话框中直接给粉丝推送小程序卡片了,这个功能似乎正在灰度测试中. 微信公众号将能够直接给用户推送小程序卡片,社交电商开始发力 一直以来,微信公众号和微信小程序一直是腾讯基于微信生态的两款明 ...
- 公众号怎么设置滑动文字_微信编辑上下滑动文字要怎么弄?具体怎么用?
微信编辑上下滑动文字要怎么弄?具体怎么用? 有时候看到别人微信公众号推送的文章里面,文字居然可以上下滑动,感觉略屌啊.其实这是在编辑的时候就操作好了的,微信编辑上下滑动文字要怎么弄? 1.打开i排版, ...
- 不关注公众号可以获取openid吗_微信公众号粉丝迁移
目录 [toc] 微信公众号迁移 正常的公众号迁移直接通过微信操作就可以,如下图.但是因为udb数据里面存的是迁移前公众号的openid以及unionid,需要自行获取新旧openid以及unioni ...
最新文章
- 一道vector实现字典的题目 C++
- java nginx tomcat_Nginx + Tomcat (java )服务器部署
- 利用grep命令查找文件内容
- 十、深入Java字符串(下篇)
- graal java_如何在CircleCI上构建支持Graal的JDK8?
- tensorflow gpu windows配置步骤教学
- Yuchuan_Linux_C编程之二 GCC编译
- Android之通过HttpURLConnection.getResponseCode状态码抛出异常的问题以及解决方法
- Hadoop生态圈-Zookeeper的工作原理分析
- javascript设计模式之发布订阅模式
- 转场动画UINavigationControllerDelegate
- 【为了爱,为了pascal】【第三章】 认识PASCAL语言基础
- win mysql编译_MySQL5.5在Windows7下编译的详细步骤
- JS特效之超级好看的鼠标小尾巴
- qq群文件问题完美解决
- 华为鸿蒙与小米新系统,华为鸿蒙系统硬刚谷歌!小米也发布新系统:却选择和谷歌系统互补...
- js 跳转到指定位置 高德地图_JS控制div跳转到指定的位置的几种解决方案总结
- [机器翻译]—BLEU值的计算
- Oracle11g下载
- 爬虫网络请求之JS解密一(百度企业信用)
热门文章
- 机器学习sklearn基础(1):多元逻辑回归分类器 (pcolormesh说明及绘图)
- puzzle(003)数字拼图、色块拼图
- lte tm模式_请教大家个问题,LTE传输模式TM1-TM8中哪种属于MIM.. - 通信技术你问我答 - 
纯技术讨论者的天地 - Powered by C114...
- 10 网站可用性的度量与考核
- MySQL基础 + 34道练习 +Mysql高级 + sql优化
- 移动硬盘插入提示需要格式化RAW_分区变成RAW格式怎么办?
- win10设置计算机关机时间,win10系统怎样设置定时关机 win10有定时关机设置吗
- java 定时关机_win7电脑怎么设置定时关机_win7电脑设置定时关机的详细教程-win7之家...
- Linux 查看显卡型号
- 信息学奥赛一本通【21CSPS提高组】和【21NOIP提高组】题解