需求:单纯的将page.source写入文件的方式,会导致一些图片无法显示,对于google浏览器,直接将页面打包下载成一个mhtml格式的文件,则可以进行离线下载。对应python selenium 微信公众号历史文章随手一点就返回首页?郁闷之下只好将他们都下载下来。:https://www.jb51.net/article/193111.htm
遇到的问题:
1、单纯使用webdriver.ActionChains无法完成下载动作,未能操作windows窗口。
2、没有找到相关能直接下载.mhtml的命名接口。
3、pywin32置顶窗口的使用不顺利。
解决思路:
1、使用selnium打开浏览器,不要操作,让其保持置顶
2、使用pyautogui、pyperclip操作键盘、鼠标、剪切板进行下载文件。
准备材料:
需要将自动化操作的一些图片截取下来,以作为后期图片匹配使用。
实现:
1、打开爬取好的链接,遍历所有需要下载的页面
# 读取文件 filename = r\'data/01 爬取微信公众号历史文章/urls 二律背反的一灯如豆-out.xlsx\' df = pd.read_excel(filename,dtype=object) df = df.reindex(columns=[\'日期\', \'标题\', \'原创\', \'地址\',\'完成情况\',\'储存地址\']) #df = df.head(5) dfsel = (df[\'标题\'] !=\'随文\') & (df[\'完成情况\'] != 1) save_folder = r\"I:\\code\\python\\data\\01 爬取微信公众号历史文章\\01 二律背反的一灯如豆\" + \"\\\\\" # 设置保存格式为 mhtml,减少要操作文件保存下拉框的情况 options = webdriver.ChromeOptions() options.add_argument(\'--save-page-as-mhtml\') # 启动浏览器 driver = webdriver.Chrome(options=options) wait = WebDriverWait(driver,10) df.loc[dfsel,\"完成情况\"],df.loc[dfsel,\"储存地址\"] = zip(*df[dfsel].apply(download_mhtml_with_not_check, axis=1,args=(driver,wait)))
2、编写相关下载页面函数
# 在timeout秒内,返回中心值,间隔时长time_setp # 封装一个pyautogui限时查找函数 # def finde_gui_element(png,timeout = 5,time_setp=0.2): i = 1 if timeout <=0 : timeout = 5 if time_setp <=0 : time_setp = 0.2 while True: if i > timeout/time_setp: return None center = pyautogui.locateCenterOnScreen(png,grayscale=False,confidence=0.9) if center == None: time.sleep(0.2) else: return center i = i + 1
主要自动化操作代码:
def download_mhtml_with_not_check(x,driver,wait): name = \'\' try: url = str(x[\'地址\']) driver.get(url) # 获取浏览器标题,用于检测是否是置顶页 wait.until(EC.presence_of_element_located((By.XPATH,\'//h2[@id=\"activity-name\"]\'))) title = driver.find_element_by_xpath(\'//h2[@id=\"activity-name\"]\').text print(\'no:\',x.name,\'url:\',url,\'title:\',title) wait.until(EC.presence_of_element_located((By.XPATH,\'//div[@id=\"page-content\"]\'))) #进入下载 pyautogui.hotkey(\'ctrl\', \'s\') # 等待一下对话框弹出 time.sleep(1) bt = finde_gui_element(r\'data\\png\\save.png\') #查找保存按键 if bt == None: return (0,\'\') else: # 根据标题组合成具体路径 name = save_folder + \' \' + title + \'.mhtml\' #print(name) pyperclip.copy(name) pyautogui.hotkey(\'ctrl\', \'v\') time.sleep(0.1) pyautogui.hotkey(\'Enter\') # 检查是否弹出另存为 bt = finde_gui_element(r\'data\\png\\confirmsaveas.png\',timeout=0.5) if bt != None: # 说明出现重复明明,点击覆盖 pyautogui.hotkey(\'Tab\') pyautogui.hotkey(\'Enter\') return (1,name) bt = finde_gui_element(r\'data\\png\\cancle.png\',timeout=0.5) if bt != None: #还爱,说明出现了一些异常 pyautogui.hotkey(\'esc\') pyautogui.hotkey(\'esc\') pyautogui.leftClick(bt) return (-1,name) # 加多一个esc防止出现窗口还在 pyautogui.hotkey(\'esc\') except Exception as e: print(str(e)) return (-2,name) return (1,name)
最后写入excel:
通过vba代码,将单元格地址添加上超链接:
Option Explicit Sub add_hype() Dim ws As Worksheet, arr As Variant, i As Long Set ws = ThisWorkbook.Worksheets(1) arr = ws.UsedRange.Value ws.Cells.Hyperlinks.Delete For i = 2 To UBound(arr) If CStr(arr(i, 2)) = \"随文\" Then Else If CStr(arr(i, 5)) = \"1\" Then ws.Hyperlinks.Add Anchor:=ws.Cells(i, 6), Address:=CStr(arr(i, 6)) End If End If Next i End Sub
完成。
不足之处:
1、通过autogui操作,难免会遇到弹窗的情况,需要增加活动窗体置顶,但是一直没有找到有效的方法。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。