python写一个自动在网页搜索资源并下载的程序

从始至终就是一个懒虫的无理取闹~

故事起因

该懒虫的拖延症使得自己不得不在国庆这个美好的日子里加班加点熬夜写开题报告以及ppt(ε=(´ο`*)))唉
说到开题报告,有一件事是不得不考虑的,那就是文献管理,需要自己在网上将所要引用的文章的引用文件下载下来导入管理器中(endnote),而这个懒虫竟然已经下载好了一百多篇论文!让它一个一个去搜下载引用文献文件?呵呵。。。不可能。。。

于是乎,它将魔爪伸向了我(码农瑟瑟发抖。。。)。
最后也就有了这个命题——如何写一个python程序自动去网上下载资源

写程序前的准备

除了安装Python(我使用的python3.7)外,还需要安装selenium和pymouse,前者用于操作浏览器,后者用于操作鼠标
关于这两个的安装可以去百度搜,每个人可能遇到的问题都不一样,但都不难解决,大部分需要安装的都可以用pip install解决(什么?你说pip install安装失败?一次不行就两次,两次不行就三次,有一个依赖项我装了5次才成功,所以在这里建议,只要是出来进度条后产生的失败多试几次便能成功,如果超过十次还是不行,建议手动安装。

pymouse需要安装依赖pywin32,详细教程如下面的链接:
https://www.cnblogs.com/SH170706/p/9640110.html

另外还需要安装你所要使用的浏览器的驱动,以便python可以操作浏览器,常用的是火狐和谷歌浏览器,网上关于这两个的教程最多

话不多说,上代码~

代码

import os
import time
from selenium import webdriver
from pymouse import PyMouseglobal index
global filenames
global filenames_cl
index = 0
filenames = []
filenames_cl = []
def file_name(file_dir):global filenamesfor root, dirs, filenames in os.walk(file_dir):  print(root) #当前目录路径#print(dirs) #当前路径下所有子目录print(filenames) #当前路径下所有非目录子文件file_dir = "D:\我的文档"
file_name(file_dir)
while(filenames):file_name = filenames.pop()filenames_cl.append(file_name[4:file_name.rfind('_')])for filename_cl in filenames_cl:driver = webdriver.Firefox()#(firefox_profile=profile) #打开火狐浏览器driver.get('https://www.cnki.net/') #打开知网界面num = driver.window_handlesprint(num)driver.find_element_by_id('txt_SearchText').send_keys(filename_cl)#在搜索框内输入想要搜索内容time.sleep(2)driver.find_element_by_class_name('search-btn').click()  #搜索完成num = driver.window_handlesprint(num)time.sleep(3)driver.switch_to.frame("iframeResult")#框架跳转driver.find_element_by_class_name('fz14').click()#点击搜索到的论文time.sleep(3)num = driver.window_handlesprint(num)driver.switch_to.window(num[1])driver.find_element_by_xpath("//div[@class='link']//a[@class='icon icon-output']").click()'''导出参考文献text文件'''time.sleep(2)num = driver.window_handlesprint(num)driver.switch_to.window(num[2])driver.find_element_by_link_text('EndNote').click()time.sleep(1)driver.find_element_by_id('exportTxt').click()time.sleep(2)m = PyMouse()m.click(468, 582,1)m.click(733, 659,1)driver.quit()index = index + 1print(index)

代码分析

整体思路

读取目标文件夹下所有非目录的子文件名,分别进行搜索资源下载,利用python打开火狐浏览器

1.首先定义了一个file_name函数:

def file_name(file_dir):global filenamesfor root, dirs, filenames in os.walk(file_dir):  print(root) #当前目录路径#print(dirs) #当前路径下所有子目录print(filenames) #当前路径下所有非目录子文件

此函数会将file_dir路径下的所有非目录的子文件名以列表的形式赋值给filenames这个全局变量

2.读取目标文件夹下的所有文件名

file_dir = "D:\我的文档"
file_name(file_dir)
while(filenames):file_name = filenames.pop()filenames_cl.append(file_name[4:file_name.rfind('_')])

至于while里面为什么这么处理呢,因为该懒虫重命名了每一篇论文!!!所以我不得不根据需要进行截取自己有用的片段。。。

3.打开浏览器,打开网页,定位元素,输入内容,下载资源

for filename_cl in filenames_cl:driver = webdriver.Firefox()#(firefox_profile=profile) #打开火狐浏览器driver.get('https://www.cnki.net/') #打开知网界面num = driver.window_handlesprint(num)driver.find_element_by_id('txt_SearchText').send_keys(filename_cl)#在搜索框内输入想要搜索内容time.sleep(2)driver.find_element_by_class_name('search-btn').click()  #搜索完成num = driver.window_handlesprint(num)

分别取出filenames_cl中的每一个文件名,打开火狐浏览器;
driver.get()打开对应网页;
获取句柄;此时句柄中只有一个元素
通过id定位输入框元素,并在输入框内输入想要搜索的内容;
等待2s,待网页打开完成,当然也可以采用隐形等待的方式,每过一段时间就搜索,直到搜索到元素;
通过类名定义到搜索键,并点击以完成搜索;
获取句柄;关于句柄,因为每次点击搜索得观察它是否是跳出新的标签页还是刷成新的页面,如果只是刷新了页面,不用换句柄,如果出了新的标签页,需要换句柄,方式见下面的代码

   time.sleep(3)driver.switch_to.frame("iframeResult")#框架跳转driver.find_element_by_class_name('fz14').click()#点击搜索到的论文time.sleep(3)num = driver.window_handlesprint(num)driver.switch_to.window(num[1])driver.find_element_by_xpath("//div[@class='link']//a[@class='icon icon-output']").click()

等待3s,待页面打开完成;
新的页面中我需要点击我搜到的结果,而该结果的元素在其他frame中,所有,这里用到了框架切换,具体是什么框架名,可以用F12在网页中查找,同理,通过class_name定位到搜索到的资源链接并点击;
现在再次查看句柄,发现句柄变成了长度为2的列表,就是因为在上一步的点击中打开了新的标签页;
此时若想要操作新的页面,就需要切换句柄,用.switch_to.window();
通过xpath来定位元素是一个值得推荐的方法,该方法可以定位到绝大部分的元素,笔者在这一步也是被逼无奈才学了一点xpath来解决此处的问题的

    '''导出参考文献text文件'''time.sleep(2)num = driver.window_handlesprint(num)driver.switch_to.window(num[2])driver.find_element_by_link_text('EndNote').click()time.sleep(1)driver.find_element_by_id('exportTxt').click()time.sleep(2)m = PyMouse()m.click(468, 582,1)m.click(733, 659,1)driver.quit()index = index + 1print(index)

接下里的几步中,前面几步同样是定位元素,然后点击;
最后一步下载所需文件时,系统跳出了下载提示选项(打开、保存,保存路径之类的),本来想进行设置,使其按设置的方式自动下载保存,可是发现由python打开的浏览器的设置都是默认设置,和我自己在浏览器中的设置毫无关系。。。
于是笔者想着能不能在程序中设置好,之后百度到了一些方法,也尝试发现没有任何用处。。。。(如果有大神路过此处,望留言告知解决方法,感激不尽)
再然后换了一种思路,控制鼠标来自动点击保存,使其保存到默认路径。
程序中通过定位到需要点击的坐标,1表示左键点击,2表示右键点击。
关于坐标获取,可以百度到很多demo程序,直接用就行了。

最后运行的结果:一次搜了40个文件,下载成功了36个,至于为什么掉了4个。
分析:笔者认为问题应该是出在了最后一步点击上面,换句话说,等待2s后,下载提示页面还没有出来,就进行了点击操作,再然后quit()关闭了浏览器。问题不可能出在其他地方,如果在其他时间中未来得及打开,程序会报错定位不到元素,以至于程序中断。

python写一个自动在网页搜索资源并下载的程序相关推荐

  1. python编写木马攻击_用Python写一个自动木马程序

    电脑作为大家日常办公的工具,最怕的一件事情之一就是被偷,当我们的电脑被盗的时候,不仅仅是电脑本身,更重要的是电脑存储的资料都会丢失.如何尽快的找回电脑需要我们想点办法,今天就教大家一个好的技巧,虽说不 ...

  2. 用python写一个自动群发微信脚本

    使用 Python 写一个自动群发微信脚本需要使用微信第三方 API 来实现.推荐使用 itchat 库,它提供了简单易用的 API,可以方便地编写微信自动化脚本. 首先,你需要安装 itchat 库 ...

  3. 发帖机python_如何用python写一个自动顶帖机?

    周末去了好朋友家玩,继上次我帮他修好电脑(插拔内存条+用橡皮擦擦金手指)后. 又问我说,小x啊,你是搞计算机的,能不能帮我写个自动顶帖(回复)的机器啊? 我的好朋友现在除了用两套房子收租外,觉得待在家 ...

  4. 没有人能比我快,用Python写一个自动填写答案的脚本

    前言 不是标题党,真的就是没有人比我快,今天用Python写了个自动填写答案的脚本,快就算了,准确率还是百分之百 话不多说 咱先看代码 后看效果 不想看全文的 点击文末名片 领取源码 环境使用 Pyt ...

  5. 利用python写一个自动获取局域网ip地址并开启服务器绕过校园网设备限制的小工具

    前言 ​ 这个学年学校把宽带运营商从之前的联通大哥哥换成了如今的电信小弟弟,使用体验可谓一落千丈,最主要的原因是电信不再像联通提供拨号上网的账号和密码,改成了强制使用天翼校园的程序来进行认证上网,而且 ...

  6. 用python写一个自动生成春联的软件,打包exe

    文章目录 唠叨一下 效果展示 代码 打包exe可执行文件 唠叨一下 最近不是快过年了,Python写对联挺火的,但是代码又不是人人都用,那就直接写个界面打包一下呗~ 主要实现只要运行后输入上联下联.横 ...

  7. python写一个自动登录脚本_Python 实现自动登录+点击+滑动验证功能

    需要用到的库有selenium,还需要安装Chrome浏览器驱动,具体如何安装我就不详述了 在这里我模拟了csdn的登录过程 ** 1**.首先打开网页,用户名+密码登录,然后定位用户名输入框,和密码 ...

  8. 用python写一个自动注册脚本_js自己写脚本自动操作注册插件基于chrome浏览器

    大家好!又到了一周的福利时间,今天给大家一个福利,以后抢票不需要手动刷新页面了,直接用你自己写的插件来控制,事先声明,本人是js菜鸟,所以今天带来的例子都是低级的例子 我自己写了一个ajax添加的程序 ...

  9. 用python写一个自动注册脚本_python写的自动登录人人网的脚本

    我今天给大家分享一个我自己用 #!/usr/bin/env python #encoding=utf-8 import sys import re import urllib2 import urll ...

  10. 如何用python创建一个下载网站-用Python写一个简单的网页下载

    作为一个Python+爬虫的小白,今天要搞点爬虫的活儿,以前没做过,从零开始. win10的系统,python我的电脑上以前不记得什么时候安装过,安装的是3.6的版本,能用.代码工具,先使用VS co ...

最新文章

  1. 两所顶尖大学,签约落地深圳!
  2. 一步步编写操作系统(1)
  3. springBoot+springSecurity 数据库动态管理用户、角色、权限(二)
  4. android布局的属性大全,Android布局属性大全
  5. 记载下这个题中的语法(对这些语法的使用不熟悉)
  6. 拦截游戏窗口被移动_「维维足球pro-教案」50个传控踢法练习之(一、二)追球游戏...
  7. 微型计算机文献,微型计算机控制系统期刊文章参考文献 哪里有微型计算机控制系统参考文献...
  8. python替代goto_如何在 Python 中实现 goto 语句
  9. html浮动跟随鼠标,jQuery 图片跟随鼠标浮动
  10. asp.net中异步调用WebService(异步页)[转]
  11. python3虚拟环境不带任何模块_Python3虚拟环境-不存在的包
  12. 服务器宕机可能的原因以及服务器宕机解决办法
  13. pythoncss50使用教程_Python学习(二十) —— 前端之CSS
  14. 【看动漫学编程】程序员在异世界生个娃 第3篇:搞不好我就是个王者
  15. 视觉点胶机系统相机、镜头参数与选择
  16. 《开学第一课》观后感——幸福
  17. WLC-WLC升级(以2504为例)
  18. pdf2htmlEX命令行参数大全
  19. python基础语法及知识总结,总有你想知道的
  20. python爬虫股票上证指数_Python爬虫爬取搜狐证券股票数据

热门文章

  1. html文本框能不能粘贴图片,[免费开源]wangEditor富文本框解决方案,粘贴自动上传图片(截图上传神器啊!),可嵌入视频,vue和jquery的BS框架都能用,不能用在cs哦!...
  2. linux 0.01内核分析与操作系统设计 百度网盘,《Linux 0.01内核分析与操作系统设计——创造你自己的操作系统》...
  3. oracle导入10个G的dmp,Oracle11g导出dmp并导入Oracle10g的操作记录
  4. 华为手机 图标消失_华为手机升级EMUI 10后解决Google Play“消失”教程
  5. html 编辑器插件安装,最新版CKEditor的配置方法及插件(Plugin)编写示例
  6. Bitmap 图片说明
  7. JVM对象分配和GC分布【JVM】
  8. 谈谈数字货币交易系统的发展
  9. 第08章-使用Spring Web Flow
  10. c# 类的序列化,以及嵌套问题