大图请右击在新标签页打开
Popen默认shell参数为False:
为True时默认使用 COMSPEC 环境变量指定的程序为shell:
在Windows上默认为cmd:
args参数为命令字符串时,因为dir是cmd的内建命令,需要指定shell=True:
例如:
而timeout,ping等都是独立的exe,可以不需要cmd:
args参数是文件路径形式时:
底层是调用了Windows的API,如下:
调试:
测试:
从调试结果以及测试来看,对于bat文件,可以不写lpApplicationName参数,Windows会自动使用cmd来运行(使用vbs文件测试返回错误:不是正确的win32程序,要指定lpApplicationName为cscript.exe才行,可能只有bat才有这个特权了)。
输入重定向的问题:
Popen是用创建子进程的方式来执行的,而timeout.exe在暂停时,可接受用户按键来终止,这个时候会需要输入,但是Popen给子进程的stdin只有
并不能让timeout重定向到用户输入上,所以出错。
解决的方法有很多,最简单的替换掉timeout语句为ping -w xxx 127.0.0.1 或者直接由python来接管timeout。
1.服务器端重定向,在服务器端完成,一般来说爬虫可以自适应,是不需要特别处理的,如响应代码301(永久重定向)、302(暂时重定向)等。具体来说,可以通过requests请求得到的response对象中的url、status_code两个属性来判断。当status_code为301、302或其他代表重定向的代码时,表示原请求被重定向;当response对象的url属性与发送请求时的链接不一致时,也说明了原请求被重定向且已经自动处理。
2.meta refresh,即网页中的<meta>标签声明了网页重定向的链接,这种重定向由浏览器完成,需要编写代码进行处理。例如,某一重定向如下面的html代码第三行中的注释所示,浏览器能够自动跳转,但爬虫只能得到跳转前的页面,不能自动跳转。
<html><head>
<meta http-equiv="refresh" content="0.1url=http://www.baidu.com/"><!--本网页会在0.1秒内refresh为url所指的网页-->
</head>
</html>
解决办法是通过得到跳转前的页面源码,从中提取出重定向url信息(上述代码第三行中的url属性值)。一个具体的操作:①使用xpath('//meta[@http-equiv="refresh" and @content]/@content')提取出content的值 ②使用正则表达式提取出重定向的url值。
3.js 重定向,通过JavaScript代码形式进行重定向。如下面javascript代码
<script language=javascript>window.location.href='http://www.baidu.com'</script>对于这种方式的跳转,由于可以实现该功能的JavaScript语句有多种形式,不能再使用正则表达式提取url,只能考虑加载JavaScript代码来进行解决。
读取键盘输入内置函数input([prompt]),用于从标准输入读取一个行,并返回一个字符串(去掉结尾的换行符):
s = input("Enter your input:")
登录后复制
注:在Python 3.x版本中取消了 raw_input() 函数。
打印到屏幕
最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式:
print([object, ...][, sep=' '][, end='endline_character_here'][, file=redirect_to_here])
登录后复制方括号内是可选的,sep表示分割符,end表示结束符,file表示重定向文件。如果要给sep、end、file指定值必须使用关键字参数。