小爬最近随着对python中字符串、json等理解进一步加深,发现先前我随笔中提到的data构造和传参方法略复杂,原本有更简单的方法,Mark如下。

先前小爬我使用的requests.post请求中data构造的代码如下:

data_search={
'page':1,
'rows':15,
'condition':
"""[\
{"column":"BPM_DEF_NAME","exp":"like","value":""},\
{"column":"DELETE_STATUS","exp":"=","value":0},\
{"column":"TO_CHAR(TO_DATE(CREATE_DATE,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD')","exp":">=","value":"YYYY-MM-DD"},\
{"column":"TO_CHAR(TO_DATE(CREATE_DATE,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD')","exp":"<=","value":"YYYY-MM-DD"},\
{"column":"CHECK_TYPE","exp":"like","value":"2"},\
{"column":"LOCKED_STATUS","exp":"=","value":0},\
{"column":"DELETE_STATUS","orderType":"default","orderKey":"","direction":"ASC"}\
]"""
, #考虑到该字段已经有单引号、双引号,所以只能用三引号来包住这部分代表字符串
'additionalParams':'{}'
}
data_search_condition=json.loads(data_search['condition']) #将字符串转为列表,方便更新列表(列表中每个元素都是一个单个字典)元素
#刷新字典
data_search_condition[0]['value']=businessName
data_search_condition[2]['value']=str(startDate)
data_search_condition[3]['value']=str(endDate)
data_search['condition']=json.dumps(data_search_condition) #将列表重新转回字符串,作为data_search字典中键“condition”对应的“value”,然后更新字典

  该方法主要通过json的dumps、loads方法来完成“字符串→字典列表→列表或字典值更新→字典、列表转回str字符串”,代码复杂且可读性差。

后细想下,上面的代码中红色部分(即data_search['condition']对应值)看上去,既有单引号、双引号、也有三引号,但其作为整体,本质上就是三引号包着的字符串,所以原则上它可以使用字符串的传参方法来载入变量,于是代码可以改为:

data_search={
'page':1,
'rows':15,
'condition':
"""[\
{"column":"BPM_DEF_NAME","exp":"like","value":"%s"},\
{"column":"DELETE_STATUS","exp":"=","value":0},\
{"column":"TO_CHAR(TO_DATE(CREATE_DATE,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD')","exp":">=","value":"%s"},\
{"column":"TO_CHAR(TO_DATE(CREATE_DATE,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD')","exp":"<=","value":"%s"},\
{"column":"CHECK_TYPE","exp":"like","value":"2"},\
{"column":"LOCKED_STATUS","exp":"=","value":0},\
{"column":"DELETE_STATUS","orderType":"default","orderKey":"","direction":"ASC"}\
]"""%(businessName,str(startDate),str(endDate)),
'additionalParams':'{}'
}

再次证明编程达到目的的方法远不止一次,但是各种方法之间在可读性、性能、复杂度上却存有差别。小爬也是告诫自己,永远要本着化繁为简的思想去编程。

  另外,小爬我给部门同事制作了一个内网数据爬取到excel的小工具,其中需要用到python中网页附件的下载、excel存储、txt存储,excel超链接生成等功能,经过摸索,终于搞定!

主要思路是,post请求(参数:“编号”)得到json文件,将json中主要字段存储到列表中,取出“附件”字段值,再去表单主页面源码中看“附件”的url,进而构造出对应的附件url地址。略去不表,下面重点讲如何下载附件、判断服务器中附件的名称和文件后缀等。

判断文件名和后缀的代码如下:

#定义fileType方法,得到文件类型
def get_fileType(response):
#fileType=response.headers['Content-Type'] # image/jpeg;charset=UTF-8 #Content-Type: application/pdf;charset=UTF-8
fileType=response.headers['Content-Disposition'] #Content-Disposition: attachment; filename=%E6%9C%96%B0%E8%90%A5%E4%B8%9A%E6%89%A7%E7%85%A7.pdf
#fileType=re.search(".*?/(.*?);.*?",fileType)
fileType=os.path.splitext(fileType)[-1][1:].lower()
return fileType

可以看到我们请求附件对应的url地址时,服务器返回的Response Headers头文件中,Content-Disposition和Content-Type字段能看到文件名和后缀,需要注意的是,实际使用时,小爬发现Content-Type字段并不总是存在,此时可能需要使用try……except方法对两个字段进行尝试,提升程序的容错能力。

下载附件、写入excel并生成超链接用到的示例代码如下:

response=requests.session().get(url)
fileType=get_fileType(response)
with open(".\\Attachment\\附件.%s"%(fileType), "wb") as code:
  code.write(response.content) #下载附件
sheet['A1'].hyperlink = ".\\Attachment\\附件.%s"%(fileType)

  小爬再说说制作简易进度条这件事儿:如果我们要制作很酷炫、多功能的GUI用户界面,当然首选pyqt5、wxPython、tkinter等著名GUI库。但是笔者如果只是想把脚本封装为exe,给一般用户使用,只是需要一个简单的进度提醒,如果对美观等没有特别的要求,则用Selenium+js的方法更容易实现。

小爬我的爬虫工具首先用selenium的driver方法打开了浏览器,之后的爬取过程,都是尽可能调用requests方法,此时网页并不会跟着刷新。原始的网页左上角如下图所示:

小爬通过selenium载入js的方法,可以更改“抽查记录信息”这个div标签在本地浏览器显示的文本为“我想要输出的进度信息”,且不会对服务器造成任何变化。巧妙达到制作进度的要求。

该div的html信息,可以通过查询网页源码得到:“<div class="haf-form-title">抽查记录信息</div>”,那么让这个页面元素对应的文本更改需要的代码很简单,先用querySelector方法定位,再更改attr属性,示例代码如下:

driver.execute_script('document.querySelector("div.haf-form-title").textContent="%s 已完成%d行数据."'%(name,Num)) 

是的,这行代码足够显示基本的进度了,你可以传入更多参数来显示总数、实时计数和百分比等,灵活运用该方法即可。实际效果如下:

                                            方法很多,我们只要做到“活学活用”即可!

Post请求data参数构造及巧用js脚本显示爬虫进度的更多相关文章

  1. Requests发Post请求data里面嵌套字典

    一.Post请求,data里面嵌套字典 Requests发Post请求,data里面嵌套字典的常见形式如下: info = { "appid": "123", ...

  2. angularjs-$http.post请求传递参数,后台Controller接受不到原因

    现象回显 js文件 app.controller('indexCtrl', function($scope, $state, $http) { $scope.login = function() { ...

  3. fiddler 抓包post请求body参数在jmeter中的书写

    jmeter请求一直报错,最后查出来是请求参数的格式写错了,醉了 记录一下,以防我再次健忘 fidder抓包显示详情 jmeter 请求body data参数书写直接复制fiddler里TextVie ...

  4. Ajax请求传递参数遇到的问题

    想写个同类型的,代码未测. 什么是WebAPI?我的理解是WebAPI+JQuery(前端)基本上能完成Web MVC的功能,即:这么理解吧,WebAPI相当于Web MVC的后台部分. 接下来直接上 ...

  5. node.js之路由,中间件,ge请求和post请求的参数

    一.路由 1.什么是路由 服务器需要根据不同的URL或请求来执行不一样的操作,我们可以通过路由来实现这个步骤 2.实现路由的方法 2.1.get请求访问网址时,做什么事 1 app.get(" ...

  6. 资料汇总--Ajax中Put和Delete请求传递参数无效的解决方法(Restful风格)【转】

    开发环境:Tomcat9.0 在使用Ajax实现Restful的时候,有时候会出现无法Put.Delete请求参数无法传递到程序中的尴尬情况,此时我们可以有两种解决方案:1.使用地址重写的方法传递参数 ...

  7. Ajax请求的参数

    post请求和get请求存放参数位置 post请求和get请求存放参数位置是不同的: post方式参数存放在请求数据包的消息体中. get方式参数存放在请求数据包的请求行的URI字段中,以?开始以pa ...

  8. WebAPI学习日记一:Ajax请求传递参数遇到的问题

    首先,本人大学刚毕业,想把自己学习的一些东西记录下来,也是和大家分享,如有不对之处还请多加指正.声明:但凡是我博客里的文章均是本人实际操作遇到的例子,不会随便从网上拷贝或者转载,本着对自己和观众负责的 ...

  9. python接口自动化11-post传data参数案例【转载】

    前言: 前面登录博客园的是传json参数,有些登录不是传json的,如jenkins的登录,本篇以jenkins登录为案例,传data参数. 一.登录jenkins抓包 1.登录jenkins,输入账 ...

随机推荐

  1. NOIP2017普及组初赛试题及答案

    普及组C++语言试题 一.单项选择题(共 20 题,每题 1.5 分,共计 30 分:每题有且仅有一个正确选项) 1.在 8 位二进制补码中,10101011 表示的数是十进制下的( ). A. 43 ...

  2. Fiddler 抓包设置

    手机抓包设置 一:配置Fiddler参数 打开Fiddler菜单项Tools->TelerikFiddler Options->HTTPS, 勾选CaptureHTTPS CONNECTs ...

  3. Docker打包 Asp.Net Core应用,在CentOS上运行(转)

    转载连接:https://www.cnblogs.com/ibeisha/archive/2017/09/09/netcoreondocker.html 本文主要介绍下运用docker虚拟技术打包As ...

  4. (转)urllib库python2和python3具体区别

    转载链接:https://blog.csdn.net/whatday/article/details/54710403 Python 2 name Python 3 name urllib.urlre ...

  5. Java eclipse导入外部项目时出错怎么解决

    从外部环境import一个项目进入Java工作环境中,若出现以下错误,解决方法如下: 鼠标移上去,会出现以下错误提示: 解决方法: 选中该项目->右键->Build path->Co ...

  6. python yield 和 yield from用法总结

    #例1. 简单输出斐波那契數列前 N 个数#缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列#要提高 fab 函数的可复用性,最好不要直接打印出数列,而是返 ...

  7. Linux 新手应该知道的 26 个命令

    https://linux.cn/article-6160-1.html 当你进入了 Linux 的世界,在下载.安装 了某个 Linux 发行版,体验了 Linux 桌面并安装了一些你喜爱和需要的软 ...

  8. h5中不能用js来直接获取网络码和机器码的。

    h5中不能用js来获取mac的.是可以获取ip的.代码  <script>var fso = new ActiveXObject("Scripting.FileSystemObj ...

  9. HTML5:离线存储

    最近由于找工作一直没时间也没有精力更新博客,找工作真是一件苦逼的事情啊...不抱怨了,我们来看看HTML5的新特性---离线存储吧. 随着Web App的发展,越来越多的移动端App使用HTML5的方 ...

  10. vue_vuex

    vuex vue 插件 npm install vuex --save 将多个组件的共享状态进行 集中式管理 - 极易破坏单向数据流 多个视图依赖于同一状态 ----- 就 props 而言:嵌套组件 ...