前言:全文已在个人网站发布:微信文章关键词爬虫教程

这是一个爬虫 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 = '

.*?(http://.*?)"'

# 使用预编译可以将整个文本中所有满足模式的链接提取出来,以列表形式存储

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,不难发现是控制搜索页的页数。

当我们搜索关键字时,进入预览页

这时需要获得当前页的所有的文章的链接,观察源代码

发现每篇文章的链接都是以

开头,在这个div中的第一个URL就是我们想要的文章链接,所以使用正则表达式的非贪婪模式,并且URL是以 http 开头,并以一个双引号结束, 正则表达式为:

.*?(http://.*?)" 这样就可以找出所有的当前页面的所有文章的链接。根据用户传进的需要爬取的文章页面数,把范围内所有的文章URL使用List存储。

在进入每篇具体的文章页面时,再次观察源码

找到文章标题所在的

标签,使用正则表达式:(.*?) 提取标题。

最后提取文章正文,这个正文是包含一些样式的,把整个文章的爬取出来

以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搜索关键词的公众号文章标题和路径_微信文章关键词爬虫教程相关推荐

  1. 微信公众号怎么推送消息_微信公众号发送消息

    A.模板消息发送 模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等.不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息. 备注 ...

  2. 微信公众号回复服务器参数错误,为什么微信文章网址在浏览器访问提示参数错误...

    有客户反映,孤狼公众号助手采集到的文章,发布到数据库里,复制数据库里的文章url,在浏览器打开,显示"参数错误"如图: 这样显示,初步判断为,URL参数输入错误了,那么到底哪里错误 ...

  3. 微信公众号发送小程序卡片_微信公众号群发文章支持添加小程序卡片

    2017年4月20日微信发布公告称,微信公众平号群发文章支持添加小程序功能,这对于推广小程序来说,无疑是不错的途径.那么微信公众号群发文章怎么添加小程序?下面爱站技术频道的小编带来的详细教程. 微信公 ...

  4. Chrome插件英雄榜110篇更新!《微信公众号同步助手》快速将微信文章同步到知乎B站等创作平台...

    title: 110 <微信公众号同步助手>是一款将微信文章同步到知乎, B站,微博,豆瓣,百家号, 简书, 头条号,搜狐号, 大鱼号, 一点资讯, Cnblog, CSDN, 51CTO ...

  5. 微信公众号发送小程序卡片_微信公众号里怎么添加小程序-如何在微信[[公众号]]添加小程序卡片-微信关联小程序...

    参考官方Demo 1.进入公众号,选择「关联小程序」后,微信公众号运营者用手机扫码进行认证,并输入小程序的AppID即可. 2.腾讯地图+小程序appID:wx7643d5f831302ab0 3. ...

  6. 公众号怎么设置滑动文字_微信公众号滑动文字怎么制作内容呢?

    微信公众号滑动文字怎么制作内容呢?如今手机的普及性,微信这个有代表性的即时通讯软件也在大家中间应用广泛,于是有了各种各样的微信公众号,今天下不为大家整理的是微信公众号滑动文字怎么弄的内容! 微信公众号 ...

  7. 分享公众号预约系统怎么做_微信公众号制作线上预约系统步骤

    现如今预约专家.预定商品都可以通过微信等社交软件来实现,不再需要我们打电话或者亲自到店咨询了,实现微信预约功能,有很多种方式,目前主流的实现方法是通过微信公众号或者小程序制作的. 编辑 那么微信公众号 ...

  8. 微信公众号发送小程序卡片_微信公众号将能够直接给用户推送小程序卡片,社交电商开始发力...

    公众号或能在对话框中直接给粉丝推送小程序卡片了,这个功能似乎正在灰度测试中. 微信公众号将能够直接给用户推送小程序卡片,社交电商开始发力 一直以来,微信公众号和微信小程序一直是腾讯基于微信生态的两款明 ...

  9. 公众号怎么设置滑动文字_微信编辑上下滑动文字要怎么弄?具体怎么用?

    微信编辑上下滑动文字要怎么弄?具体怎么用? 有时候看到别人微信公众号推送的文章里面,文字居然可以上下滑动,感觉略屌啊.其实这是在编辑的时候就操作好了的,微信编辑上下滑动文字要怎么弄? 1.打开i排版, ...

  10. 不关注公众号可以获取openid吗_微信公众号粉丝迁移

    目录 [toc] 微信公众号迁移 正常的公众号迁移直接通过微信操作就可以,如下图.但是因为udb数据里面存的是迁移前公众号的openid以及unionid,需要自行获取新旧openid以及unioni ...

最新文章

  1. 一道vector实现字典的题目 C++
  2. java nginx tomcat_Nginx + Tomcat (java )服务器部署
  3. 利用grep命令查找文件内容
  4. 十、深入Java字符串(下篇)
  5. graal java_如何在CircleCI上构建支持Graal的JDK8?
  6. tensorflow gpu windows配置步骤教学
  7. Yuchuan_Linux_C编程之二 GCC编译
  8. Android之通过HttpURLConnection.getResponseCode状态码抛出异常的问题以及解决方法
  9. Hadoop生态圈-Zookeeper的工作原理分析
  10. javascript设计模式之发布订阅模式
  11. 转场动画UINavigationControllerDelegate
  12. 【为了爱,为了pascal】【第三章】 认识PASCAL语言基础
  13. win mysql编译_MySQL5.5在Windows7下编译的详细步骤
  14. JS特效之超级好看的鼠标小尾巴
  15. qq群文件问题完美解决
  16. 华为鸿蒙与小米新系统,华为鸿蒙系统硬刚谷歌!小米也发布新系统:却选择和谷歌系统互补...
  17. js 跳转到指定位置 高德地图_JS控制div跳转到指定的位置的几种解决方案总结
  18. [机器翻译]—BLEU值的计算
  19. Oracle11g下载
  20. 爬虫网络请求之JS解密一(百度企业信用)

热门文章

  1. 机器学习sklearn基础(1):多元逻辑回归分类器 (pcolormesh说明及绘图)
  2. puzzle(003)数字拼图、色块拼图
  3. lte tm模式_请教大家个问题,LTE传输模式TM1-TM8中哪种属于MIM.. - 通信技术你问我答 - 纯技术讨论者的天地 - Powered by C114...
  4. 10 网站可用性的度量与考核
  5. MySQL基础 + 34道练习 +Mysql高级 + sql优化
  6. 移动硬盘插入提示需要格式化RAW_分区变成RAW格式怎么办?
  7. win10设置计算机关机时间,win10系统怎样设置定时关机 win10有定时关机设置吗
  8. java 定时关机_win7电脑怎么设置定时关机_win7电脑设置定时关机的详细教程-win7之家...
  9. Linux 查看显卡型号
  10. 信息学奥赛一本通【21CSPS提高组】和【21NOIP提高组】题解