0


python和selenium爬虫,网页表格下载自动化脚本

一、selenium是啥

  • 框架底层使用JavaScript模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。
  • 使浏览器兼容性测试自动化成为可能,尽管在不同的浏览器上依然有细微的差别。
  • 使用简单,可使用Java,Python等多种语言编写用例脚本。

二、selenium的安装

1、在python中安装selenium 命令:pip install selenium

在这里插入图片描述

安装成功:

在这里插入图片描述

2、使用谷歌浏览器,在谷歌浏览器的设置中查询自己的谷歌浏览器的版本:设置→关于

在这里插入图片描述

3、下载谷歌浏览器驱动

​ 下载地址:https://registry.npmmirror.com/binary.html?path=chromedriver/

​ 找到符合版本号的驱动文件夹

在这里插入图片描述

选择适合你电脑的驱动版本,window下载win32的就好了

在这里插入图片描述
下载之后,将解压的文件放在python的目录中
在这里插入图片描述

三、使用selenium写自动化网页操作脚本

1、import要用到的包

  1. import time
  2. import os
  3. import shutil
  4. from selenium import webdriver
  5. from selenium.webdriver.common.by import By
  6. from selenium.webdriver.support import expected_conditions as EC
  7. from selenium.webdriver.support.wait import WebDriverWait

咱也分不清这些包具体哪个是干嘛的,但是在程序里都用上了

2、selenium使用

思路:由于selenium自动化脚本是模拟人的操作,所以程序就按照你对这个网站进行操作的顺序写

2.1打开谷歌浏览器、窗口最大化

  1. driver = webdriver.Chrome()
  2. driver.maximize_window()

2.2输入网址

  1. driver.get("你要让程序进入的网址")

2.3selenium的定位

selenium的定位到某一个网页上的元素(输入框、按钮等)的方法共有八种,具体是哪八种可以百度,这里只介绍我用到最方便的一种(XPATH定位)。举个例子。

在网页中按F12,显示网页源码。点击定位器

在这里插入图片描述

再在网页上点击这个元素,源码中就会标出,比如我点击百度的输入框,这个输入框的代码的就会被标蓝色

在这里插入图片描述

在这里插入图片描述

右键标蓝代码→Copy→Copy XPath

在这里插入图片描述

这个时候你就复制了这个元素的xpath了,可以在程序中使用

比如:我要在登录页面输入账号和密码,然后点击登录按钮

  1. driver.find_element(by=By.XPATH, value="你复制的账号输入框的XPath").send_keys("你的账号")
  2. driver.find_element(by=By.XPATH, value="你复制的密码输入框的XPath").send_keys("你的密码")
  3. driver.find_element(by=By.XPATH, value="你复制的登录按钮的XPath").click()

2.4selenium获取某一元素的文本,比如标签或者按钮上的文字

这个可以用于下载的数据表格文件的命名,否则下载的文件很可能是乱命名的,不便于我们的使用。

  1. my_text = driver.find_element(by=By.XPATH, value="该元素的XPath").text

2.5selenium回到页面顶部或者拉到页面底部

我在程序中遇到某一页面滚动条被滑到底部之后,脚本中点击页面顶部的某个按钮就报错了,所以我思考需要将页面先滑回到顶部。(按钮点击无效有很多种情况,比如也可能是按钮被某些弹窗覆盖导致定位不到,百度多几种方法试试应该能解决)

  1. #滑到底部
  2. driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")#滑到顶部
  3. driver.execute_script("var q=document.documentElement.scrollTop=0")

2.6selenium的等待页面加载

selenium的等待有三种,①傻瓜等待,sleep(3),这样就可以等待3秒。②隐式等待,设置一个时间上限,在这个时间内,当整个页面加载完成的时候或者达到时间上限的时候,退出等待(具体想了解的话可以百度)③显式等待(显示等待),我们往往不需要等到整个页面加载完,加载出我们所需要的数据就可以了

以下代码表示:时间上限1000s,在这个时间中,每0.5秒检查一次tag1的这个元素有没有加载出来,我的程序中定位的是数据表格底部的页码按钮,因为这按钮出来了就表示我要的表格中的数据都加载出来了,当这个元素被加载出来或者是到达1000s上限的时候,就停止等待了。

  1. tag1 =(By.XPATH,"加载出的元素的xpath")#当这个元素加载出来的时候,就停止等待了try:
  2. WebDriverWait(driver,1000,0.5).until(EC.presence_of_element_located(tag1))except:print("量表字段加载失败")break

3、判断文件是否下载完成、整理下载的文件

  • 这里使用查看文件夹中文件列表的方法判断文件是否下载完成,我爬的就是csv文件,所以这样做是没问题的。如果是其他的有可能遇到文件夹中出现系统文件或者临时文件,要通过限定文件后缀之类的方法排除。
  • 这里是设置了20s内每0.5秒检查一次,如果发现文件夹中文件已经存在,就停止等待和检查。
  • 将下载的文件重命名并整理(复制)到新的文件夹中,我的命名是在网页中通过.text获得的信息(往上看2.4中)
  • 文件整理到新的文件夹中之后,删除os.remove下载文件夹中的这一个文件,以免跟下一个下载的文件混淆
  1. deffind_file(path, all_files,liangbiao):
  2. file_list = os.listdir(path)
  3. seconds =0
  4. dl_wait =Truewhile dl_wait and seconds <20:if file_list ==[]:
  5. time.sleep(0.5)
  6. seconds +=0.5
  7. file_list = os.listdir(path)else:
  8. dl_wait =Falseforfilein file_list:
  9. full_path = os.path.join(path,file)
  10. file_name = os.path.basename(full_path)
  11. new_dir = sort_path + liangbiao
  12. new_path = new_dir +'//'+ liangbiao +'.csv'if os.path.exists(new_path):print("该文件夹已存在,无法创建!")else:print("下载路径:{}".format(full_path))print("整理路径:{}".format(new_path))
  13. os.mkdir(new_dir)
  14. shutil.copyfile(full_path, new_path)
  15. os.remove(full_path)

4、完整代码

  1. import time
  2. import os
  3. import shutil
  4. from selenium import webdriver
  5. from selenium.webdriver.common.by import By
  6. from selenium.webdriver.support import expected_conditions as EC
  7. from selenium.webdriver.support.wait import WebDriverWait
  8. folder_path ="C://Users//Winner//Downloads"
  9. sort_path ="D://Desktop//update//"
  10. driver = webdriver.Chrome()
  11. driver.maximize_window()
  12. driver.get("我的数据网站登录页面网址")print(driver.current_url)print(driver.title)
  13. driver.find_element(by=By.NAME, value="username").send_keys("我的账号")
  14. driver.find_element(by=By.NAME, value="password").send_keys("我的密码")
  15. driver.find_element(by=By.NAME, value="login").click()deffind_file(path, all_files,liangbiao):
  16. file_list = os.listdir(path)
  17. seconds =0
  18. dl_wait =Truewhile dl_wait and seconds <20:if file_list ==[]:
  19. time.sleep(0.5)
  20. seconds +=0.5
  21. file_list = os.listdir(path)else:
  22. dl_wait =Falseforfilein file_list:
  23. full_path = os.path.join(path,file)
  24. file_name = os.path.basename(full_path)
  25. new_dir = sort_path + liangbiao
  26. new_path = new_dir +'//'+ liangbiao +'.csv'if os.path.exists(new_path):print("该文件夹已存在,无法创建!")else:print("下载路径:{}".format(full_path))print("整理路径:{}".format(new_path))
  27. os.mkdir(new_dir)
  28. shutil.copyfile(full_path, new_path)
  29. os.remove(full_path)for i inrange(16,150):
  30. num = i+1print("===================================开始爬取第%s个量表========================================================="% i)
  31. xpath1 =("//*[@id='DefineFields']/div/div[3]/div[1]/div/div/ul/li[%s]/div/label"% num)
  32. driver.get("https://data.healthybrainnetwork.org/dataquery/")print("进入页面dataquery")
  33. driver.find_element(by=By.XPATH, value="//*[@id='reactTest']/div/div[2]/nav/ul[1]/li[2]").click()print("进入DefineFields")
  34. driver.find_element(by=By.XPATH, value="//*[@id='DefineFields']/div/div[3]/div[1]/div/div/button").click()print("Select One 点击成功")
  35. liangbiao = driver.find_element(by=By.XPATH, value=xpath1).text
  36. liangbiao_i =str(i)+ liangbiao
  37. driver.find_element(by=By.XPATH, value=xpath1).click()print("量表标签选择成功,等待{}的字段加载中.......".format(liangbiao))
  38. tag1 =(By.XPATH,"//*[@id='DefineFields']/div/div[4]/div/ul")try:
  39. WebDriverWait(driver,1000,0.5).until(EC.presence_of_element_located(tag1))except:print("量表字段加载失败")breakprint("字段页面加载成功")try:
  40. driver.execute_script("var q=document.documentElement.scrollTop=0")except:print("滚动到页面顶部失败")
  41. driver.find_element(by=By.XPATH, value="//*[@id='DefineFields']/div/div[2]/div/button[1]").click()print("Add All按钮点击成功")
  42. driver.find_element(by=By.XPATH, value="/html/body/div[1]/div/div/div[2]/div/div/div/div[2]/nav/ul[1]/li[4]").click()print("进入View Data页面")
  43. driver.find_element(by=By.XPATH, value="//*[@id='ViewData']/div[1]/div[1]/button").click()print("Run Query按钮点击成功")
  44. tag =(By.XPATH,"//*[@id='ViewData']/div[3]/div[3]/div/div/div[2]/button")try:
  45. WebDriverWait(driver,1000,0.5).until(EC.presence_of_element_located(tag))except:print("数据查询失败")breakprint("数据查询成功,开始下载csv文件")
  46. driver.find_element(by=By.XPATH, value="//*[@id='ViewData']/div[3]/div[3]/div/div/div[2]/button").click()print("Download Table as CSV按钮点击成功")#对下载的文件进行整理归档
  47. contents_list = find_file(path=folder_path, all_files=[],liangbiao = liangbiao_i)

在这里插入图片描述

标签: python 爬虫 selenium

本文转载自: https://blog.csdn.net/WinnerCC/article/details/124350823
版权归原作者 WinnerCC 所有, 如有侵权,请联系我们删除。

“python和selenium爬虫,网页表格下载自动化脚本”的评论:

还没有评论