十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
class FakeOut:
成都创新互联公司服务项目包括讷河网站建设、讷河网站制作、讷河网页制作以及讷河网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,讷河网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到讷河省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
def __init__(self):
self.str=''
self.n=0
def write(self,s):
self.str+="Out:[%s] %s\n"%(self.n,s)
self.n+=1
def show(self): #显示函数,非必须
print self.str
def clear(self): #清空函数,非必须
self.str=''
self.n=0
f=FakeOut()
import sys
old=sys.stdout
sys.stdout=f
print 'Hello weird.'
print 'Hello weird too.'
sys.stdout=old
f.show()
# 输出:
# Out:[0] Hello weird.
# Out:[1]
# Out:[2] Hello weird too.
# Out:[3]
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.1;url="!--本网页会在0.1秒内refresh为url所指的网页--
/head
/html
解决办法是通过得到跳转前的页面源码,从中提取出重定向url信息(上述代码第三行中的url属性值)。一个具体的操作:①使用xpath('//meta[@http-equiv="refresh" and @content]/@content')提取出content的值 ②使用正则表达式提取出重定向的url值。
3.js 重定向,通过JavaScript代码形式进行重定向。如下面javascript代码
script language=javascriptwindow.location.href=''/script
对于这种方式的跳转,由于可以实现该功能的JavaScript语句有多种形式,不能再使用正则表达式提取url,只能考虑加载JavaScript代码来进行解决。
重定向与请求历史
默认情况下,除了 HEAD, Requests会自动处理所有重定向。
可以使用响应对象的 history 方法来追踪重定向。
Response.history 是一个:class:Response requests.Response 对象的列表,为了完成请求而创建了这些对象。
这个对象列表按照从最老到最近的请求进行排序。
例如,Github将所有的HTTP请求重定向到HTTPS。:
r = requests.get('')
r.url
r.status_code
r.history
如果你使用的是GET, OPTIONS, POST, PUT, PATCH 或者 DELETE,,那么你可以通过allow_redirects 参数禁用重定向处理:
r = requests.get('', allow_redirects=False)
r.status_code
r.history
如果你使用的是HEAD,你也可以启用重定向:
r = requests.head('', allow_redirects=True)
r.url
r.history
import sys
f = open('a.txt','w')
print sys.stdout,'hello,world'
hello,world
print f,'hello,world'
f.close()
输出到屏幕的内容重定向到文件,供参考。
另,print函数的源码
def print(stream):
""" print(value, ..., sep=' ', end='\\n', file=sys.stdout)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline. """
pass
控制台重定向
最简单常用的输出重定向方式是利用控制台命令。这种重定向由控制台完成,而与Python本身无关。
Windows命令提示符(cmd.exe)和Linux Shell(bash等)均通过""或""将输出重定向。其中,""表示覆盖内容,""表示追加内容。类似地,"2"可重定向标准错误。重定向到"nul"(Windows)或"/dev/null"(Linux)会抑制输出,既不屏显也不存盘。
以Windows命令提示符为例,将Python脚本输出重定向到文件(为缩短篇幅已删除命令间空行):
E:\echo print 'hello' test.py
E:\test.py out.txt
E:\type out.txt
hello
E:\test.py out.txt
E:\type out.txt
hello
hello
E:\test.py nul
注意,在Windows命令提示符中执行Python脚本时,命令行无需以"python"开头,系统会根据脚本后缀自动调用Python解释器。此外,type命令可直接显示文本文件的内容,类似Linux系统的cat命令。
Linux Shell中执行Python脚本时,命令行应以"python"开头。除""或""重定向外,还可使用tee命令。该命令可将内容同时输出到终端屏幕和(多个)文件中,"-a"选项表示追加写入,否则覆盖写入。示例如下(echo $SHELL或echo $0显示当前所使用的Shell):
[wangxiaoyuan_@localhost ~]$ echo $SHELL
/bin/bash
[wangxiaoyuan_@localhost ~]$ python -c "print 'hello'"
hello
[wangxiaoyuan_@localhost ~]$ python -c "print 'hello'" out.txt
[wangxiaoyuan_@localhost ~]$ cat out.txt
hello
[wangxiaoyuan_@localhost ~]$ python -c "print 'world'" out.txt
[wangxiaoyuan_@localhost ~]$ cat out.txt
hello
world
[wangxiaoyuan_@localhost ~]$ python -c "print 'I am'" | tee out.txt
I am
[wangxiaoyuan_@localhost ~]$ python -c "print 'xywang'" | tee -a out.txt
xywang
[wangxiaoyuan_@localhost ~]$ cat out.txt
I am
xywang
[wangxiaoyuan_@localhost ~]$ python -c "print 'hello'" /dev/null
[wangxiaoyuan_@localhost ~]$
若仅仅想要将脚本输出保存到文件中,也可直接借助会话窗口的日志抓取功能。
注意,控制台重定向的影响是全局性的,仅适用于比较简单的输出任务。