1
alexrezit 2013-04-29 07:51:56 +08:00
urllib2.install_opener(opener)
我不会 Python, 不过在 build opener 下面加上这句应该就可以了, 你试试吧. |
2
mckelvin 2013-04-29 08:57:33 +08:00 via iPhone
没跑过lz的代码,如果代码是文档上抄的没有问题那可能是服务器检测到了是爬虫,response headers里就没有加set-cookies ,建议request headers里补上User-Agent、Referer等项。
推荐使用requests模块的session,使用异常方便。它把cookie封装好了,但还是有些坑,极少数情况下才需要人工去干预cookie。 |
3
lfhong 2013-04-29 10:16:14 +08:00 1
我给你贴一个我写的browser吧,希望你能用上。
import gzip import socket import urllib2 import cookielib from StringIO import StringIO class Browser(object): def __init__(self, filecookie=None, PROXY=None): VERSION = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/13.0.761.0 Safari/534.35' self.version = VERSION self.headers = [] self.headers.append(('User-agent', self.version)) self.headers.append(('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')) self.headers.append(('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.3')) self.headers.append(('Accept-Encoding', 'gzip')) self.headers.append(('Accept-Language', 'en-US,en;q=0.8')) self.headers.append(('Connection', 'keep-alive')) if filecookie: self.cj = cookielib.MozillaCookieJar(filecookie) else: self.cj = cookielib.CookieJar() if PROXY and 'http' in PROXY: proxy_handler = urllib2.ProxyHandler(PROXY) self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj), proxy_handler) else: self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj)) self.opener.addheaders = self.headers def addheaders(self, headers): self.opener.addheaders = self.headers + headers def open(self, url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT): if data: pg = self.opener.open(url, data, timeout=timeout) else: pg = self.opener.open(url, timeout=timeout) if pg.info().get('Content-Encoding') == 'gzip': buf = StringIO(pg.read()) f = gzip.GzipFile(fileobj=buf) return f.read() else: return pg.read() |
4
lfhong 2013-04-29 10:18:12 +08:00
用的时候
browser = Browser() pg_content = browser.open(url) # 这是用 GET pg_content = browser.open(url, data={'username':'1234', 'password': '12345'}) # POST |
5
for4 2013-04-29 10:58:00 +08:00 via iPad
建议用requests
|
6
exoticknight OP @alexrezit 还是不行……
|
7
exoticknight OP @mckelvin info()输出后是可以看到有set-cookie的……所以我才去折腾cookie
|
8
exoticknight OP @lfhong 贴代码好评~我先去试试
|
9
scola 2013-04-29 15:12:25 +08:00
前不久帮同事写了个下载助手,快速下载内部网站上的文件,网站需要登录
lz可以参考下 https://gist.github.com/325862401/5403766 里面用到两个库ClientCookie ClientForm,参考这个 http://code.activestate.com/recipes/391929-access-password-protected-web-applications-for-scr/ |
10
exoticknight OP @for4 似乎是要keepalive的问题,我去试试requests
|
11
exoticknight OP @scola 谢谢,我去研究一下
|
12
qdcanyun 2013-04-29 19:25:45 +08:00
我可以推荐的requests里的Session么 完全满足你的要求
|
13
exoticknight OP @qdcanyun 我去看了一下似乎是这样,正在抓包+尝试^_^
|