前段时间在用scrapy爬取某个网站时一直报521错误,在seeting.py里设置HTTPERROR_ALLOWED_CODES= [521]后会发现返回的response是一段加密的js代码。这段js代码是动态取得cookie信息的(可是只有一个value,故放弃了使用python库去执行js的打算),最后利用浏览器打开网页将其cookie手动添加到爬虫中会正常返回数据,最后找到了Ghost.py这个库去模拟浏览器打开网站行为并动态获取cookie信息的办法。python
.安装Ghost.py
sudo pip install Ghost.py==0.1.2web
from ghost import Ghost from scrapy import log import re class Cookieutil: def __init__(self,url): log.msg('init cookieutil class ,will be get %s cookie information!' %url, log.INFO) gh = Ghost(download_images=False,display=False) gh.open(url) gh.open(url) gh.save_cookies("cookie.txt") gh.exit() def getCookie(self): cookie = '' with open("cookie.txt") as f: temp = f.readlines() for index in temp: cookie += self.parse_oneline(index).replace('\"','') return cookie[:-1] def parse_oneline(self,src): oneline = '' if re.search("Set-Cookie",src): oneline = src.split(';')[0].split(':')[-1].strip()+';' return oneline
这里只贴上主要的代码浏览器
headers={ 'Cookie':'', 'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2', } headers['Cookie'] = Cookieutil('http://www.dmoz.org.cn/').getCookie() def parse_page(self,response): if int(time.time())-self.begin_time>3600: print 'get a new cookie arrgment' print self.headers['Cookie'] self.begin_time = int(time.time()) try: self.headers['Cookie'] = Cookieutil('http://www.dmoz.org.cn/').getCookie() except: time.sleep(120) self.headers['Cookie'] = Cookieutil('http://www.dmoz.org.cn/').getCookie()
不过有个比较纠结的问题是Ghost.py须要依赖webkit,以至于在本地开发中可以正常运行,可是放到服务器中直接报错(Exception: Ghost.py requires PySide or PyQt4)。
目前为止还没找到好的解决办法服务器