python爬取网页链接和静态文件链接_Python selenium如何打包静态网页并下载

需求:单纯的将page.source写入文件的方式,会导致一些图片无法显示,对于google浏览器,直接将页面打包下载成一个mhtml格式的文件,则可以进行离线下载。对应python selenium 微信公众号历史文章随手一点就返回首页?郁闷之下只好将他们都下载下来。:http://www.zzvips.com/article/93516.html

遇到的问题:

1、单纯使用webdriver.ActionChains无法完成下载动作,未能操作windows窗口。

2、没有找到相关能直接下载.mhtml的命名接口。

3、pywin32置顶窗口的使用不顺利。

解决思路:

1、使用selnium打开浏览器,不要操作,让其保持置顶

2、使用pyautogui、pyperclip操作键盘、鼠标、剪切板进行下载文件。

准备材料:

需要将自动化操作的一些图片截取下来,以作为后期图片匹配使用。

1-200Q3000405.png

实现:

1、打开爬取好的链接,遍历所有需要下载的页面

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

# 读取文件

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、编写相关下载页面函数

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

# 在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

主要自动化操作代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

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:

1-200Q3000405-50.png

通过vba代码,将单元格地址添加上超链接:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Option Explicit

Sub add_hype()

Dim ws As Worksheet, arr As Variant, i AsLong

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操作,难免会遇到弹窗的情况,需要增加活动窗体置顶,但是一直没有找到有效的方法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/cycxtz/p/13419578.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值