作者:芦子根_889 | 来源:互联网 | 2023-08-30 19:48
前言前段时间在用scrapy爬取某个网站时一直报521错误,在seeting.py里设置HTTPERROR_ALLOWED_CODES[521]后会发现返回的response是一段
前言
前段时间在用scrapy爬取某个网站时一直报521错误,在seeting.py里设置HTTPERROR_ALLOWED_CODES= [521]后会发现返回的response是一段加密的js代码。这段js代码是动态取得COOKIE信息的(但是只有一个value,故放弃了使用python库去执行js的打算),最后利用浏览器打开网页将其COOKIE手动添加到爬虫中会正常返回数据,最后找到了Ghost.py这个库去模拟浏览器打开网站行为并动态获取COOKIE信息的办法。
具体步骤
.安装Ghost.py
sudo pip install Ghost.py==0.1.2
返回最新的COOKIE
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
scrapy的spider定时生成和调用COOKIE信息
这里只贴上主要的代码
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)。
目前为止还没找到好的解决办法