最便捷的微信公众号文章下载器——基于Python爬虫

优采云 发布时间: 2022-05-07 05:31

  最便捷的微信公众号文章下载器——基于Python爬虫

  

  源 | 简书 文|_SoLo_

  总结一下自己原创的一个“亲民取巧的”获取微信公众号文章的方法。

  1需求分析

  平时爱逛知乎,收藏了不少别人推荐的数据分析、机器学习相关的微信公众号(这里就不列举了,以免硬广嫌疑)。但是在手机微信上一页页的翻阅历史文章浏览,很不方便,电脑端微信也不方便。

  所以我就想有什么方法能否将这些公众号文章下载下来。这样的话,看起来也方便。但是网上的方法要么太复杂(对于我这个爬虫入门新手来说),要么付费。

  但我的需求其实却很简单——“方便的查找 / 检索 / 浏览相关公众号的任意文章”,所以,一番学习检索后,上手做了一个小工具(打包成可执行文件了),虽然方法和代码相当简单,但实际上手用起来还是挺方便的。也给身边伙伴安利了几波。

  工具需求:

  2现有方案

  之前在网上也搜索了些爬取微信公众号的资料,大概有如下几种

  selenium爬取流程AnyProxy代理批量采集Fiddler设置代理和抓包

  通过对多个账号进行抓包分析,可以确定:

  可能存在的问题:

  如果只是想爬取文章内容,似乎并没有访问频率限制,但如果想抓取阅读数、点赞数,超过一定频率后,返回就会变为空值。

  付费平台

  例如清博 新榜,如果只是想看数据的话,直接看每天的榜单就可以了,还不用花钱,如果需要接入自己的系统的话,他们也提供api接口()

  3项目步骤3.1基本原理

  目标爬取网站()收录了微信平台大部分的优质微信公众号文章,会定期更新,经测试发现对爬虫较为友好。

  1、网站页面布局排版规律,不同公众号通过链接中的account区分

  2、一个公众号合集下的文章翻页也有规律:id号每翻一页+12

  

  传送门.png

  所以流程思路就是

  3.2环境3.3公众号信息检索

  通过对目标url发起requset请求,获取页面html信息,然后调用正则方法匹配两条信息

  1、该公众号是否存在

  2、如果存在,最大的文章收录页数是多少

  <p style="margin-left: 16px;margin-right: 16px;margin-bottom: 20px;">    url = 'http://chuansong.me/account/' + str(name) + '?start=' + str(0)    

   wait = round(random.uniform(1,2),2) # 设置随机爬虫间隔,避免被封

   time.sleep(wait)    

   html = get_one_page(url)    

   pattern1 = re.compile('Page Not Found.', re.S)

   item1 = re.findall(pattern1, html)  # list类型    

   pattern2 = re.compile('(.\d+)(\s*)(\s*?)下一页')

   item2 = re.findall(pattern2, html)  # list类型  

   if item1:        print("\n---------该账号信息尚未收录--------\n")

       exit();    else:        print("\n---------该公众号目前已收录文章页数N为:",item2[0][0])  

</p>

  当公众号存在时,直接调用request解析目标请求链接。

  <p style="margin-left: 16px;margin-right: 16px;margin-bottom: 20px;">    #需要加一个请求头部,不然会被网站封禁

   headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}    try:      

       response = requests.get(url, headers=headers, timeout=10)

       response.raise_for_status #若不为200,则引发HTTPError错误

       response.encoding = response.apparent_encoding        return response.text    except:        return "产生异常"</p>

  注意,目标爬虫网站必须要加headers,否则直接拒绝访问

  3.4正则解析,提取链接和文章标题

  以下代码用于从html文本中解析链接和标题文字信息

  <p style="margin-left: 16px;margin-right: 16px;margin-bottom: 20px;">def parse_one_page(html):

   pattern = re.compile('.*?.*?<a class="question_link" href="(.*?)".*?_blank"(.*?)/a.*?"timestamp".*?">(.*?)', re.S)

   items = re.findall(pattern, html)      

   return items</p>

  3.5自动跳转页面

  以下代码通过循环递增赋值,改变url中的页码参数

  <p style="margin-left: 16px;margin-right: 16px;margin-bottom: 20px;">def main(offset, i):    

   url = 'http://chuansong.me/account/' + str(offset) + '?start=' + str(12*i)

   print(url)

   wait = round(random.uniform(1,2),2) # 设置随机爬虫间隔,避免被封

   time.sleep(wait)    

   html = get_one_page(url)    

   for item in parse_one_page(html):

       info = 'http://chuansong.me'+item[0]+','+ item[1]+','+item[2]+'\n'

       info = repr(info.replace('\n', ''))

       print(info)        #info.strip('\"')  #这种去不掉首尾的“        

       #info = info[1:-1]  #这种去不掉首尾的“

       #info.Trim("".ToCharArray())

       #info.TrimStart('\"').TrimEnd('\"')

       write_to_file(info, offset)  

</p>

  3.6去掉标题中的非法字符

  因为windows下文件命令,有些字符是不能用了,所以需要使用正则剔除

  <p style="margin-left: 16px;margin-right: 16px;margin-bottom: 20px;">itle = re.sub('[\\\\/:*?\"|]', '', info.loc[indexs]['标题'])</p>

  3.7转换html为PDF

  使用pandas的read_csv函数读取爬取的csv文件,循环遍历“链接”,“标题”,“日期”

  然后通过调用pdfkit函数转换生成PDF文件

  <p style="margin-left: 16px;margin-right: 16px;margin-bottom: 20px;"> wait = round(random.uniform(1,2),2) # 设置随机爬虫间隔,避免被封

   time.sleep(wait)

   path = get_path(offset)

   path_wk = r'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe' #安装wkhtmltopdf的位置

   config = pdfkit.configuration(wkhtmltopdf = path_wk)    if path == "" :

       print("尚未抓取该公众号")    else:        

       info = get_url_info(offset)              

       for indexs in info.index:  

           url = info.loc[indexs]['链接']

           title = re.sub('[\\\\/:*?\"|]', '', info.loc[indexs]['标题'])

           date = info.loc[indexs]['日期']

           wait = round(random.uniform(4,5),2) # 设置随机爬虫间隔,避免被封

           time.sleep(wait)  

           print(url)            with eventlet.Timeout(4,False):

               pdfkit.from_url(url, get_path(offset)+'\\'+ date+'_'+title+'.pdf', configuration=config)  

               print('转换成功!')</p>

  3.8生成的PDF结果

  

  结果4.png

  4结果展示4.1爬取结果

  

  结果1.png

  爬取的几个公众号分文件夹存储

  

  ![结果3.png](%7CimageView2/2/w/1240)

  文件夹目录下的内容

  爬取的CSV内容格式

  4.2工具运行示例

  

  查看微信公众号名称

  

  2.png

  输入公众号名称和下载的页数

  

  下载内容

  原文链接:

  -END-

  转载声明:本文选自「 简书」,搜索原文链接即可关注

  

  重磅推出全新学习模式

  用打卡学Python

  每天30分钟

  30天学会Python编程

  

  世界正在奖励坚持学习的人!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线