- 写作目的
- 1. 获取公众号文章链接
- 2. 解析公众号文章
- 3. 保存有道笔记
- 源代码
- 最后感想
做这个程序是出于自己的学习目的。因为我有学习英语的习惯,每天看公众号TeachGwen的推送文章,并把相关文章短语词汇记录到有道笔记,方便以后复习。但又不是每次都可以在电脑面前学习,很多时候是对着手机看,手机上粘贴复制到有道笔记很麻烦,还容易出错。于是萌生了写个python爬虫自动抓取文章并保存有道笔记的想法。从有这个想法到最后写成,时间也不长,网上资料很多,实现也不复杂,主要使用了爬虫常用的request,xml解析等模块。
该程序分三部分:
1. 获取公众号文章链接这部分参考了爬虫如何爬取微信公众号文章,利用微信订阅号里面的查询公众号文章的功能来爬取公众号文章的url,更新时间等信息。
-
https://mp.weixin.qq.com/ 在这里申请订阅号,注册登录后,在公众号系统里面->内容与互动->草稿箱->新的创作->写新图文->超链接->公众号搜索
如下: -
点击搜索,便出现了该公众号下所有文章的列表。
-
利用chrome中的develop tool获取 Request URL, Headers等信息来构造request请求包。
url里面包括了begin和count参数,表示翻页获取任何也一页内所有文章列表。同样可以构造不同的url来获取你想要页数的所有文章。 -
注意事项
- 因为公众号登录的cookie是有时效的,大概一周,不能一直使用一个cookie。
- python爬虫如何实现每天爬取微信公众号的推送文章方法也不再好用,因为微信网页版已经不能通过wxpy登陆,这个方法也无效。
- 而且登录需要扫描微信二维码,旦旦账号密码也不能完成登录。
- 目前只能自己手动登录获取cookie再执行程序,没有其他好的办法。如果有大神指点感激不尽。
self.headers = {
"cookie": "appmsglist_action_3889698448=card; ***", #此处使用自己的cookie
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36",
}
for i in range(30):
self.BEGIN = str(i * 5)
url = "https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin={BEGIN}&count=5&fakeid={FAKEID}&type=9&query=&token={TOKEN}&lang=zh_CN&f=json&ajax=1".format(
BEGIN=self.BEGIN, FAKEID=self.FAKEID, TOKEN=self.TOKEN)
r = requests.request("GET", url, headers=self.headers)
content_json = r.json()
200即成功返回,把其中的app_msg_list中的时间日期,标题,url link提出出来,保存到文件中。
for item in content_json["app_msg_list"]:
# 提取每页文章的标题及对应的url
items = []
tupTime = time.localtime(item['update_time'])
# standardTime = time.strftime("%Y-%m-%d %H:%M:%S", tupTime)
standardTime = time.strftime("%Y%m%d", tupTime) # 获得日期
items.append(standardTime)
items.append(item["title"])
items.append(item["link"])
content_list.append(items)
name = ['title', 'date', 'link']
test = pd.Dataframe(columns=name, data=content_list)
this_date = datetime.datetime.today().date()
this_date = this_date.strftime(format='%Y%m%d')
list_file = "articles/GwenList" + this_date + ".csv"
test.to_csv(list_file, mode='a', encoding='utf-8')
2. 解析公众号文章
- 获取文章html内容
将获得的所有文章列表取出到一个list中,因为每天的推送文章有好几篇,时间日期又是从最新日期开始往后排,所以写了个reorder_list函数来重新把文章从最老的排到最新的,但每天的文章依然保持原有顺序。通过list中的url,用 requests.get 获取文章所有内容,此时的header不需要cookie,因为这是大家都可以查看的文章,只需要"User-Agent"字段即可。
response = requests.get(url, headers=self.headers)
- 解析html
剩下的就是解析获取的html内容,抓取自己想要的信息,所有文本信息都在js_content中。利用BeautifulSoup提取这个div标签所有内容,然后用正则表达式除去不想显示各种tag的内容,例如照片,视频等。后面再根据每种类型文章取出自己想要的section内容,除掉那些广告和自己不想要的部分。
递归从后往前寻找某个字段,使用如下rfind_n_substr函数。最后存为后缀.md文件。 - 为什么保留html格式
后面考虑到保存到有道笔记是markdown格式,认得html标签,才采用了保留原有html内容。如果只想要提取文本内容,那可以使用html.xpath来取得文本内容,如此就不带有格式了,可能效果不那么好。但markdown的弊端就是后期不好编辑,各有长短,看个人取舍。
soup = BeautifulSoup(html_str, 'html.parser')
for k in soup.find_all('div'):
if k.has_attr('id') and k['id'] == 'js_content':
html_content = str(k)
html_content = re.sub(r'n+', '', html_content)
result = re.sub("", "",
html_content)
result = re.sub("", "", result)
result = re.sub("", "", result)
result = re.sub("", "", result)
result = re.sub("", "", result)
result = re.sub("", "", result)
result = re.sub("", "", result)
result = re.sub("", "", result)
result = re.sub("", "", result)
# 在src字符串里,从end出往前找,找到第count个sub子字符串。
def rfind_n_substr(self, src, sub, count, end):
index = src.rfind(sub, 0, end)
if index != -1 and count > 1:
return self.rfind_n_substr(src, sub, count - 1, index - 1)
return index
def save_md(self, html_str, page_name):
file_path = "articles/{}.md".format(page_name)
with open(file_path, 'a+', encoding="utf-8") as f:
f.write(html_str)
3. 保存有道笔记
- 首先,登录网页版有道笔记,手动操作保存笔记,用developer tool跟踪request的url和headers,记录下来。尤其是cstk。
- 把刚保存的md文件读出
- 用uuid构造fileId, 填写data内容,把文件内容放入bodyString字段
- 利用reqests.post方法,保存到有道笔记。
fileId = "WEB" + uuid.uuid1().hex
data = {
"fileId": fileId,
"parentId": "SVR168BF776AD9D44ABB8579527EF93CB26",
"name": title,
"domain": 1,
"rootVersion": -1,
"dir": "false",
"sessionId": "",
"bodyString": content.encode('utf-8'),
"createTime": int(time.time()),
"modifyTime": int(time.time()),
"transactionId": fileId
}
res = requests.post(url, headers=self.HEADERS, data=data)
- 提醒:为防止爬虫被禁,设置random的sleep时间,不要频繁抓取。
- 最后效果:
GwenCrawler
最后感想其实整个程序不难,但开始怎么寻找方法花了不少时间,还考虑用有道笔记API但注册太麻烦,也没人维护。也考虑印象笔记等,但markdown支持html不友好。
打通流程后,又在调试html内容里面花了好久,有些固定格式文章呈现的效果比较满意,目前有些随机文章的格式还是不那么理想,日后有空再调。对于不同日期节假日的文章格式都有可能不一样,也做了一些处理。也想过做一个GUI界面,把数据存入数据库等,这些都可以以后慢慢延展,至少目前足够用了。
- 参考文章:
https://blog.csdn.net/jingyoushui/article/details/100109164
https://blog.csdn.net/jingyoushui/article/details/100138450
https://blog.csdn.net/qq_44667896/article/details/104793547



