gpt4 book ai didi

python - 为什么 Python 说这个 Netscape cookie 文件无效?

转载 作者:太空狗 更新时间:2023-10-29 20:48:05 28 4
gpt4 key购买 nike

我正在写一个 Google Scholar解析器,并基于 this answer ,我在抓取 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 样式,以防万一,但这并没有解决问题。我能找到的最接近的规范是 this ,这对我来说并不意味着我失踪了。最后四行中每一行的字段都由制表符分隔,而不是空格,其他一切对我来说都是正确的。

最佳答案

我在您的示例代码或 cookies.txt 文件副本中没有发现任何明显错误的内容。

我已经检查了 MozillaCookieJar._really_load method 的源代码,它会抛出您看到的异常。

此方法做的第一件事是读取您指定文件的第一行(使用 f.readline())并使用 re.search寻找正则表达式模式 "#( Netscape)? HTTP Cookie File"。这就是您的文件失败的原因。

肯定看起来您的 cookies.txt 会匹配该格式,因此您看到的错误非常令人惊讶。

请注意,您的文件是使用简单的 open(filename) call 打开的。早些时候,所以它将以文本模式打开,并支持通用行结束,这意味着您在 Windows 上运行它并不重要。代码将看到 \n 换行终止字符串,无论文件本身使用何种换行约定。

在这种情况下,我会做的是三次检查您的文件的第一行确实是正确的。它需要包含“# HTTP Cookie File”或“# Netscape HTTP Cookie File”(只有空格,没有制表符,单词之间,大小写匹配)。使用 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 代码使用的正则表达式匹配。

您还可以使用 pdb python debugger验证 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 session 中,我结合使用了 stepnext 命令来验证正则表达式测试 (self.magic_re.search( magic)) 居然通过了。

关于python - 为什么 Python 说这个 Netscape cookie 文件无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11529428/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com