最近一个朋友在跟我讨论如何将某一个微信公众号上的历史文章列表连同文章链接地址采集下来,其实这就用到了爬虫技术。
爬虫技术难吗?不难,但我说这个不难的前提是拥有一些技术基础。关键的爬虫技术有很多可选的,比如selenium、scrapy、splash、fiddler 等等。我比较喜欢的一种爬虫技术栈基本也就涉及:开发语言、中间代理。自动化工具 selenium 现在都不喜欢用了,因为真要说如何伪装真人操作,不如直接在真实浏览器里通过 JavaScript 直接来。
你到底做啥的?为啥还会爬虫?我算是一名狂热的技术控吧,而且技术涉猎比较广,研究的技术比较多。爬虫这块,2019 年时独立负责采集 youtube 数据、香港新闻媒体网站数据、抖音数据,辅助采集过 facebook 社交网站、Instagram 图片分享网站。也算小有经验。
进入正题了。
一、pip 安装 mitmproxy
我们要使用 python 开发语言来处理网络请求数据,这里要用的是 mitmproxy 作为中间代理。至于代理是什么其实很好理解,代理相当于中间商,不管供应商(网站服务器)卖什么,最终顾客(浏览器客户端)最终买什么,中间商(代理)都能从中知道两方交换的商品信息。我们只要在网络数据传输过程中,有个代理,就能中途截获网络中传输的数据。
pip3 install mitmproxy
二、安装 mitmproxy 证书
代理软件安装好了还不行,还要支持 https 协议。现在网络传输用的绝大多数都是 https(http + ssl) 协议,其实也就是在 http 协议的基础上,加了一层 ssl 安全加密传输协议。我们的代理软件必须安装证书,才能解析 https 传输的数据。
mitmdump
执行完这个命令,会在一个目录下生成 mitmproxy 证书文件。
双击这个文件,继续往下走,
步骤 3 这一步不需要输入密码,依然是直接下一步,
三、编写代码
from mitmproxy import http
def response(flow: http.HTTPFlow):
# 1. 过滤出微信相关的网络请求
if flow.request.pretty_host == "mp.weixin.qq.com":
# print("url -> ", flow.request.pretty_url)
# print("path -> ", flow.request.path)
# 2. 过滤出 【拾遗】这个公众号的文章列表 -- 特别注意:不同的实际爬取需求,使用不同的字符串片段过滤,这就看使用者的开发语言功底了
if flow.request.path.startswith("/mp/homepage"):
print("key url -> ", flow.request.pretty_url)
print("我想要的数据:")
article_list = flow.response.json()['appmsg_list']
for article in article_list:
print("文章标题:", article["title"])
print("副标题:", article["digest"])
print("作者名:", article["author"])
print("文章链接:", article["link"])
命令行启动代理,并配置脚本
mitmdump -p 8080 test.py
电脑开启全局代理
注意:用完,记得把电脑全局代理再关掉,刚刚忘了关,结果浏览器打不开了,文章也发布不出去。
四、看看效果
五、写在最后
北京已经进入冬天模式了,之前几天跑步感觉太冷了,今天下去跑步多穿了件衣服,结果跑出汗又脱了,结果停下来时没套上,便着凉了,这会咳嗽着在,还在灌着我这辈子喝过最苦的药——同仁堂感冒清热颗粒(无蔗糖)。
想起前阵子我们领导感冒,我还在那嘚瑟着说:“我是不会感冒的,我现在经常运动……”。真是,哈哈哈!说明体质确实是健康的基础,但也不是拿来放肆的。其实我们经常走户外的人心里很明白,基本上走户外出意外的都是强驴,一定要时刻谨记对自然保持敬畏,毕竟区区血肉之躯呀。天冷了,都记着穿好衣服。