Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么urlopen可以下载谷歌搜索页面,但不能下载谷歌学者搜索页面?_Python_Python 3.x_Urllib_Google Scholar - Fatal编程技术网

Python 为什么urlopen可以下载谷歌搜索页面,但不能下载谷歌学者搜索页面?

Python 为什么urlopen可以下载谷歌搜索页面,但不能下载谷歌学者搜索页面?,python,python-3.x,urllib,google-scholar,Python,Python 3.x,Urllib,Google Scholar,我正在使用Python3.2.3的urllib.request模块下载谷歌搜索结果,但我得到了一个奇怪的错误,urlopen与谷歌搜索结果的链接一起工作,而不是谷歌学者。在本例中,我正在搜索“JOHN SMITH”。此代码成功打印HTML: from urllib.request import urlopen, Request from urllib.error import URLError # Google try: page_google = '''http://www.goog

我正在使用Python3.2.3的
urllib.request
模块下载谷歌搜索结果,但我得到了一个奇怪的错误,
urlopen
与谷歌搜索结果的链接一起工作,而不是谷歌学者。在本例中,我正在搜索
“JOHN SMITH”
。此代码成功打印HTML:

from urllib.request import urlopen, Request
from urllib.error import URLError

# Google
try:
    page_google = '''http://www.google.com/#hl=en&sclient=psy-ab&q=%22JOHN+SMITH%22&oq=%22JOHN+SMITH%22&gs_l=hp.3..0l4.129.2348.0.2492.12.10.0.0.0.0.154.890.6j3.9.0...0.0...1c.gjDBcVcGXaw&pbx=1&bav=on.2,or.r_gc.r_pw.r_qf.,cf.osb&fp=dffb3b4a4179ca7c&biw=1366&bih=649'''
    req_google = Request(page_google)
    req_google.add_header('User Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120427 Firefox/15.0a1')
    html_google = urlopen(req_google).read()
    print(html_google[0:10])
except URLError as e:
    print(e)
但这段代码与Google Scholar相同,会引发一个
URLError
异常:

from urllib.request import urlopen, Request
from urllib.error import URLError

# Google Scholar
try:
    page_scholar = '''http://scholar.google.com/scholar?hl=en&q=%22JOHN+SMITH%22&btnG=&as_sdt=1%2C14'''
    req_scholar = Request(page_scholar)
    req_scholar.add_header('User Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120427 Firefox/15.0a1')
    html_scholar = urlopen(req_scholar).read()
    print(html_scholar[0:10])
except URLError as e:
    print(e)
回溯:

Traceback (most recent call last):
  File "/home/ak5791/Desktop/code-sandbox/scholar/crawler.py", line 6, in <module>
    html = urlopen(page).read()
  File "/usr/lib/python3.2/urllib/request.py", line 138, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.2/urllib/request.py", line 369, in open
    response = self._open(req, data)
  File "/usr/lib/python3.2/urllib/request.py", line 387, in _open
    '_open', req)
  File "/usr/lib/python3.2/urllib/request.py", line 347, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.2/urllib/request.py", line 1155, in http_open
    return self.do_open(http.client.HTTPConnection, req)
  File "/usr/lib/python3.2/urllib/request.py", line 1138, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [Errno -5] No address associated with hostname>
回溯(最近一次呼叫最后一次):
文件“/home/ak5791/Desktop/code sandbox/scholar/crawler.py”,第6行,在
html=urlopen(page.read)()
urlopen中的文件“/usr/lib/python3.2/urllib/request.py”,第138行
返回opener.open(url、数据、超时)
文件“/usr/lib/python3.2/urllib/request.py”,第369行,打开
响应=自身打开(请求,数据)
文件“/usr/lib/python3.2/urllib/request.py”,第387行,打开
"开放",
文件“/usr/lib/python3.2/urllib/request.py”,第347行,在调用链中
结果=func(*args)
文件“/usr/lib/python3.2/urllib/request.py”,第1155行,在http\u open中
返回self.do_open(http.client.HTTPConnection,req)
文件“/usr/lib/python3.2/urllib/request.py”,第1138行,打开
引发URL错误(err)
urllib.error.urleror:
我通过在Chrome中搜索并从那里复制链接获得了这些链接。一位评论员报告了一个403错误,我有时也会得到这个错误。我想这是因为谷歌不支持刮学者。但是,更改用户代理字符串并不能解决此问题或原始问题,因为我大多数时候都会遇到
URLErrors

似乎表明,在谷歌给你搜索结果之前,你需要设置一些cookie:

/*

 Need a cookie file (scholar_cookie.txt) like this:

# 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

*/
这一点得到了证实,其中包括一条警告,即谷歌会检测脚本,如果您大量使用脚本,它将禁用您。

似乎表明您需要在谷歌提供结果之前设置一些cookie:

/*

 Need a cookie file (scholar_cookie.txt) like this:

# 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

*/

这一点得到了谷歌的证实,其中包括一条警告,谷歌会检测脚本,如果你大量使用脚本,它将禁用你。

我得到403(禁止),这可能意味着谷歌不希望你从学者搜索中获取信息。服务条款可能不允许这样做(我没有检查)。@SvenMarnach我更新了问题,因为我试图更改用户代理字符串。有时会出现
URLError
,有时会出现403错误。不过,大多数时候我都是前者,我得到的是403(禁止),这可能意味着谷歌不希望你从学者搜索中获取信息。服务条款可能不允许这样做(我没有检查)。@SvenMarnach我更新了问题,因为我试图更改用户代理字符串。有时会出现
URLError
,有时会出现403错误。然而,大多数情况下我都得到了前者。Python配方很棒,尽管有点过时,因为结果页面的HTML布局已经改变了。不过,通过一些调整,它完全按照需要工作。我不想将这个问题与新问题联系起来,但是你知道为什么你描述的cookie不能作为正确的cookie进行验证吗?我一直在尝试,因为它阻碍了我的整个应用程序。Python配方很棒,尽管有点过时,因为结果页面的HTML布局已经改变了。不过,通过一些调整,它完全按照需要工作。我不想将这个问题与新问题联系起来,但是你知道为什么你描述的cookie不能作为正确的cookie进行验证吗?我一直在尝试,因为它阻碍了我的整个应用程序。