scrapy爬蟲使用Ghost.py動態獲取cookie

前言

前段時間在用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

返回最新的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)。
目前爲止還沒找到好的解決辦法服務器

相關文章
相關標籤/搜索