Python 抓取微信公众号文章

jsic9405 8年前
   <p>今天继续向 Python 头条添加数据信息,完成了微信公号的爬虫,接下来会继续通过搜狗的知乎搜索抓取知乎上与 Python 相关的文章、问答。</p>    <p>微信公众号的文章链接有些是具有时效性的,过一段时间会变成参数错误而无法访问,但是我们发现从公众号后台点击过去得到的链接却是永久链接,其参数不会改变链接也不会失效,也就是说只要能够获得这些参数就可以得到永久链接。通过观察发现即使从搜狗搜索入口的有时效性的链接访问网页,其源码中也带有这些参数:</p>    <p><img src="https://simg.open-open.com/show/ef855407e4c939deb27113917b2f97c5.jpg"></p>    <p>所以只要解析这几个参数,就可以构造出永久链接。</p>    <p>首先通过搜狗搜索入口,可以获取 Python 关键词搜索的结果,地址为:</p>    <pre>  <code class="language-python">HOST = 'http://weixin.sogou.com/'  entry = HOST + "weixin?type=2&query=Python&page={}"</code></pre>    <p>提取链接、标题和摘要信息:</p>    <pre>  <code class="language-python">import requests as req  import re  rInfo = r'<h4[\s\S]*?href="([\s\S]*?)".*?>([\s\S]*?)<\/a>[\s\S]*?<\/h4>\s*<p[\s\S]*?>([\s\S]*?)<\/p>'    html  = req.get(entry.format(1)) # 第一页  infos = re.findall(rInfo, html)</code></pre>    <p>由于关键词搜索会在标题或摘要中产生特定格式的标签,需要过滤:</p>    <pre>  <code class="language-python">def remove_tags(s):    return re.sub(r'<.*?>', '', s)</code></pre>    <p>然后根据时效性链接获取文章内容,并从中提取参数信息:</p>    <pre>  <code class="language-python">from html import unescape  from urllib.parse import urlencode    def weixin_params(link): html = req.get(link) rParams = r'var (biz =.*?".*?");\s*var (sn =.*?".*?");\s*var (mid =.*?".*?");\s*var (idx =.*?".*?");' params = re.findall(rParams, html)   if len(params) == 0:   return None return {i.split('=')[0].strip(): i.split('=', 1)[1].strip('|" ') for i in params[0]}    for (link, title, abstract) in infos: title = unescape(self.remove_tag(title)) abstract = unescape(self.remove_tag(abstract)) params = weixin_params(link) if params is not None: link = "http://mp.weixin.qq.com/s?" + urlencode(params) print(link, title, abstract)</code></pre>    <p>由此可以收集到以 Python 为关键词的微信公众号文章,包括链接、标题和摘要。如需文章内容也可以随时通过链接提取,但是为了尊重创作者,请在抓取文章正文的时候请检查原创信息并合理标注作者及引用信息。</p>    <p> </p>    <p>来自:http://mp.weixin.qq.com/s?__biz=MzI0NjIxMzE5OQ==&mid=2656697797&idx=1&sn=a8e93bbc960c7564c2054a24e2414145#rd</p>    <p> </p>