写在前面,欢迎大家访问我的博客:Scout He
前言
1、由于搜狗搜索只能看到最近十篇文章 2、有找到过从网页端微信获取的,但是我的微信网页端登不上只能放弃 3、还有了解过pywinauto的windows的自动化,但是已经用过playwright,还要花时间去学习 4、找到有利用公众号后台的超链接进行爬取的方法 因此决定使用playwright来解决这个问题
1、playwright录制脚本
首先使用playwright录制脚本,将大概的过程进行录制: playwright codegen -o wehcet_fetch.py https://mp.weixin.qq.com/ 在录制前要想好大概的步骤,以及后面需要进行循环的翻页操作
2、设置循环
由于在后台页面只要在超链接里操作就可以,所以只需要设置: 1、更换公众号名字的循环 2、同一个公众号文章翻页循环
通过这两步即将整个的流程处理完成了 下面就是run()函数,传入的参数分别是:
name: 公众号名字列表
all_artical: 储存文章的列表
def run(playwright: Playwright,name,all_artical) -> None:
browser = playwright.chromium.launch(headless=False)
context = browser.new_context(accept_downloads=True)
page = context.new_page()
page.goto("https://mp.weixin.qq.com/")
with page.expect_popup() as popup_info:
page.click("text=图文消息 文字消息 视频消息 音频消息 图片消息 转载 >> svg")
page1 = popup_info.value
num = 0
page1.click("text=超链接")
for item in name:
all_artical.append([])
page1.click("text=选择其他公众号")
page1.click("[placeholder=\"输入文章来源的公众号名称或微信号,回车进行搜索\"]")
page1.fill("[placeholder=\"输入文章来源的公众号名称或微信号,回车进行搜索\"]", item)
page1.click("[placeholder=\"输入文章来源的公众号名称或微信号,回车进行搜索\"]")
page1.press("[placeholder=\"输入文章来源的公众号名称或微信号,回车进行搜索\"]", "Enter")
page1.click("text=订阅号")
time.sleep(3)
while True:
if page1.is_editable(
"#vue_app > div.weui-desktop-link-dialog > div.weui-desktop-dialog__wrp > div > div.weui-desktop-dialog__bd > div.link_dialog_panel > form:nth-child(1) > div:nth-child(4) > div > div > div.weui-desktop-media__list-wrp > div > div"):
numbers = artical_save(page1, num)
if numbers<5:
break
else:
page1.click("text = 下一页")
time.sleep(random.random()*10)
continue
这个函数中需要注意的是: 1、大的循环的设定位置在打开超链接之后,点击选择其他公众号 之前 2、小的翻页循环设定在搜索公众号之后,循环下一页 3、判断是否到最后一页,由于我目前没有找到可行的方法,只能使用判断最后一页的文章个数小于五来跳出循环,虽然问题很大,但我就赌他最后一页不是五个QAQ。
3、总结
3.1、目前的问题
1、最后一页的判断方法有问题 2、由于微信公众号的限制,导致翻页过快,系统会封禁一段时间,所以需要将翻页时间设定较长时间,但是经过我的实验,在结束第一个60页的公众号后,到第二个还是会出现系统错误的问题,无法翻页,此问题目前还未解决。 3、没有设置自动登录。 4、playwright应该有可以直接获取页面信息的方法,但目前我还没有找到,只能通过BeautifulSoup 来分析页面.
最后的完整源码在我的GitHub上,欢迎下载。
|