我正在编写一个Google Scholar解析器,并基于this answer,在获取HTML之前设置cookies。这是我的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,它并不表示我缺少任何东西。最后四行中的每一行上的字段都由制表符而不是空格分隔,其他所有字段在我看来都是正确的。
在我的场景中,需要对MozillaCookieJar进行两个修改(/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/)
魔术头球
您可以删除检查逻辑或添加我喜欢的魔术头
新的文件格式似乎允许您省略过期
最后,我真的希望执行情况能随着新的变化而更新。
我在您的示例代码或cookies.txt文件的副本中没有看到明显错误的内容。
我已经检查了^{} method 的源代码,它抛出了您看到的异常。
这个方法做的第一件事是读取指定文件的第一行(使用} 查找正则表达式模式
f.readline()
)并使用^{"#( Netscape)? HTTP Cookie File"
。这就是你的文件失败的原因。显然,它看起来像是您的
cookies.txt
将匹配该格式,所以您看到的错误是相当令人惊讶的。请注意,您的文件是用前面的一个简单的^{} call 打开的,因此它将以支持通用行结尾的文本模式打开,这意味着您在Windows上运行它并不重要。代码将看到以
\n
换行结尾的字符串,而不管文件本身使用了什么换行约定。在这种情况下,我要做的是对文件的第一行进行三次检查。它需要包含“#HTTP Cookie文件”或“#Netscape HTTP Cookie文件”(只有空格,没有制表符,字词之间,大写匹配)。使用python提示符测试:
当我在提示符处键入
line
时,Python将该行表示形式回显给我,包括\n
换行符。任何惊喜,如制表符或unicode零宽度空格将显示在那里作为转义码。我还验证了cookiejar
代码使用的正则表达式是否匹配。您还可以使用^{} python debugger 来验证
http.cookiejar
模块的实际功能:在上面的示例pdb会话中,我使用了
step
和next
命令的组合来验证正则表达式测试(self.magic_re.search(magic)
)是否实际通过。相关问题 更多 >
编程相关推荐