8

私はGoogleScholarパーサーを作成しており、この回答に基づいて、HTMLを取得する前にCookieを設定しています。これは私のcookies.txtファイルの内容です:

# Netscape HTTP Cookie File
# http://curlm.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

.scholar.google.com     TRUE    /       FALSE   2147483647      GSP     ID=353e8f974d766dcd:CF=2
.google.com     TRUE    /       FALSE   1317124758      PREF    ID=353e8f974d766dcd:TM=1254052758:LM=1254052758:S=_biVh02e4scrJT1H
.scholar.google.co.uk   TRUE    /       FALSE   2147483647      GSP     ID=f3f18b3b5a7c2647:CF=2
.google.co.uk   TRUE    /       FALSE   1317125123      PREF    ID=f3f18b3b5a7c2647:TM=1254053123:LM=1254053123:S=UqjRcTObh7_sARkN

これは、HTMLを取得するために使用しているコードです。

import http.cookiejar
import urllib.request, urllib.parse, urllib.error

def get_page(url, headers="", params=""):
    filename = "cookies.txt"
    request = urllib.request.Request(url, None, headers, params)
    cookies = http.cookiejar.MozillaCookieJar(filename, None, None)
    cookies.load()
    cookie_handler = urllib.request.HTTPCookieProcessor(cookies)
    redirect_handler = urllib.request.HTTPRedirectHandler()
    opener = urllib.request.build_opener(redirect_handler,cookie_handler)
    response = opener.open(request)
    return response

start = 0
search = "Ricardo Altamirano"
results_per_fetch = 20
host = "http://scholar.google.com"
base_url = "/scholar"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; U; ru; rv:5.0.1.6) Gecko/20110501 Firefox/5.0.1 Firefox/5.0.1'}
params = urllib.parse.urlencode({'start' : start,
                                 'q': '"' + search + '"',
                                 'btnG' : "",
                                 'hl' : 'en',
                                 'num': results_per_fetch,
                                 'as_sdt' : '1,14'})

url = base_url + "?" + params
resp = get_page(host + url, headers, params)

完全なトレースバックは次のとおりです。

Traceback (most recent call last):
  File "C:/Users/ricardo/Desktop/Google-Scholar/BibTex/test.py", line 29, in <module>
    resp = get_page(host + url, headers, params)
  File "C:/Users/ricardo/Desktop/Google-Scholar/BibTex/test.py", line 8, in get_page
    cookies.load()
  File "C:\Python32\lib\http\cookiejar.py", line 1767, in load
    self._really_load(f, filename, ignore_discard, ignore_expires)
  File "C:\Python32\lib\http\cookiejar.py", line 1997, in _really_load
    filename)
http.cookiejar.LoadError: 'cookies.txt' does not look like a Netscape format cookies file

NetscapeのCookieファイル形式に関するドキュメントを探しましたが、問題を示すものが見つかりません。含める必要のある改行はありますか?念のため、行末をUnixスタイルに変更しましたが、問題は解決しませんでした。私が見つけることができる最も近い仕様はこれです、それは私が行方不明であることを私に何も示していません。最後の4行のそれぞれのフィールドは、スペースではなくタブで区切られており、他のすべては私には正しいように見えます。

4

3 に答える 3

11

サンプルコードまたはcookies.txtファイルのコピーに明らかに間違っているものは何もありません。

MozillaCookieJar._really_loadメソッドのソースコードを確認しました。これにより、表示される例外がスローされます。

このメソッドが最初に行うことは、(を使用してf.readline())指定したファイルの最初の行を読み取り、を使用re.searchして正規表現パターンを探すことです"#( Netscape)? HTTP Cookie File"。これがファイルの失敗です。

確かにあなたはそのフォーマットに一致するように見えるcookies.txtので、あなたが見るエラーは非常に驚くべきものです。

ファイルは以前の簡単なopen(filename)呼び出しで開かれるため、ユニバーサルラインエンディングをサポートするテキストモードで開かれることに注意してください。つまり、Windowsでこれを実行していることは問題ではありません。\nファイル自体で使用されている改行規則に関係なく、コードには改行で終了する文字列が表示されます。

この場合、私が行うことは、ファイルの最初の行が本当に正しいことをトリプルチェックすることです。「#HTTP Cookieファイル」または「#Netscape HTTP Cookieファイル」のいずれかを含める必要があります(スペースのみ、単語間にタブなし、大文字と小文字を区別)。Pythonプロンプトでこれをテストします。

>>> f = open('cookies.txt')
>>> line = f.readline()
>>> line
'# Netscape HTTP Cookie File\n'
>>> import re
>>> re.search("#( Netscape)? HTTP Cookie File", line)
<_sre.SRE_Match object at 0x10fecfdc8>

lineプロンプトで入力すると、Pythonは\n改行文字を含む行表現をエコーし​​ました。タブ文字やUnicodeのゼロ幅スペースなどのサプライズは、エスケープコードとして表示されます。また、コードで使用されている正規表現がcookiejar一致することを確認しました。

pdbPythonデバッガーを使用して、http.cookiejarモジュールが実際に何をするかを確認することもできます。

>>> import pdb
>>> import http.cookiejar
>>> jar = http.cookiejar.MozillaCookieJar('cookies.txt')
>>> pdb.run('jar.load()')
> <string>(1)<module>()
(Pdb) s
--Call--
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1759)load()
-> def load(self, filename=None, ignore_discard=False, ignore_expires=False):
(Pdb) s
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1761)load()
-> if filename is None:
(Pdb) s
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1762)load()
-> if self.filename is not None: filename = self.filename
(Pdb) s
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1765)load()
-> f = open(filename)
(Pdb) n
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1766)load()
-> try:
(Pdb) 
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1767)load()
-> self._really_load(f, filename, ignore_discard, ignore_expires)
(Pdb) s
--Call--
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1989)_really_load()
-> def _really_load(self, f, filename, ignore_discard, ignore_expires):
(Pdb) s
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1990)_really_load()
-> now = time.time()
(Pdb) n
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1992)_really_load()
-> magic = f.readline()
(Pdb) 
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1993)_really_load()
-> if not self.magic_re.search(magic):
(Pdb) 
> /opt/local/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/http/cookiejar.py(1999)_really_load()
-> try:

上記のサンプルpdbセッションでは、コマンドstepnextコマンドの組み合わせを使用して、正規表現テスト(self.magic_re.search(magic))が実際に合格したことを確認しました。

于 2012-07-18T07:47:31.590 に答える
4

開発コンソールでこれをお願いします

copy('# Netscape HTTP Cookie File\n' + document.cookie.split(/; /g).map(e => e.replace('=', '\t')).map(e => window.location.hostname.replace('www.', '.') + '\tTRUE\t/\tFALSE\t-1\t' + e).join('\n'))

Netscape形式のCookieはシステムのクリップボードにあります:)

于 2020-04-19T19:57:15.233 に答える
3

私のシナリオでは、MozillaCookieJarに(/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/)の下で2つの変更が必要です。

  1. 魔法のヘッダー

    チェックロジックを削除するか、私が好むその魔法のヘッダーを追加することができます

    #NetscapeHTTPCookieファイル

  2. 新しいファイル形式では、有効期限を省略できるようです

    vals = line.split("\t")
    if len(vals) == 7 :
        domain, domain_specified, path, secure, expires, name, value = vals
    if len(vals) == 6 :
        domain, domain_specified, path, secure, name, value = vals
        expires = None
    

最後に、実装が新しい変更に更新されることを本当に望んでいます。

于 2015-04-19T06:32:10.953 に答える