关于用requests.get()返回的url的问题

LilyChen_adada 2016-12-02 11:25:23
部分代码如下:


# request with first searching page
page_request = requests.get(api_resource + search_param, headers=headers)
# response to json
page = json.loads(page_request.content.decode("utf-8"))
# List of articles from this page
articles_list = page['search-results']['entry']


如果我输出page_request.url,点击进去就是个XML,显示:
<service-error><status>
<statusCode>AUTHORIZATION_ERROR</statusCode>
<statusText>No APIKey provided for request</statusText>
</status></service-error>
但我又可以通过语句获取返回网页的内容。这是怎么回事呢?
在Python里我是避开了这个问题,毕竟能得到我要的数据。但是我在C++里用CInternetSession重现这个功能的时候,

fileGet=(CHttpFile*)session.OpenURL(url,1,1,header);
while(fileGet->ReadString(strLine)!=NULL){
strHTML+=strLine;}

输出strHTML就是<service-error><status>
<statusCode>AUTHORIZATION_ERROR</statusCode>
<statusText>No APIKey provided for request</statusText>
</status></service-error>。
如何解决这个No APIKey provided for request的错误?能不能像Python那样避开这个问题?
求指导!谢谢~~
...全文
1340 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
LilyChen_adada 2016-12-05
  • 打赏
  • 举报
回复
UPUPUP
LilyChen_adada 2016-12-04
  • 打赏
  • 举报
回复
不要沉了啊~求解~~
振翅高飞 2016-12-02
  • 打赏
  • 举报
回复
引用 3 楼 sinat_34123577 的回复:
[quote=引用 2 楼 luciferisnotsatan 的回复:] 返回401这个授权错误么?你在python里怎么绕过的? 一般服务器端返回这错误就是你没有授权,然后客户端发送一个授权(比如,用户名/密码) 抓下报文看看python和C++这两者发送的请求报文具体有哪些区别。
我在python里就是没有管它,直接根据key来取我要的value,就能取出来。

page = json.loads(page_request.content.decode("utf-8"))
self.N=page['search-results']['opensearch:totalResults']
所以是我的APIKey有问题吗?[/quote] 你的请求报文头是不是没加一些校验项?从回复来看,确实像是缺少授权。 需要模拟登录。
luciferisnotsatan 2016-12-02
  • 打赏
  • 举报
回复
引用 3 楼 sinat_34123577 的回复:
[quote=引用 2 楼 luciferisnotsatan 的回复:] 返回401这个授权错误么?你在python里怎么绕过的? 一般服务器端返回这错误就是你没有授权,然后客户端发送一个授权(比如,用户名/密码) 抓下报文看看python和C++这两者发送的请求报文具体有哪些区别。
我在python里就是没有管它,直接根据key来取我要的value,就能取出来。

page = json.loads(page_request.content.decode("utf-8"))
self.N=page['search-results']['opensearch:totalResults']
所以是我的APIKey有问题吗?[/quote] No APIKey provided for request 这个也是server返回的吧。你要有server端的代码或者文档,可以查查到底出了什么问题。 没法查看server端,那么python没问题,CInternetSession这个有问题,那最好抓包看看报文到底有什么区别。比如user-agent,说不定server认python,不认CInternetSession的。像爬虫就会自己标注为爬虫/机器人,然后网站不想爬虫爬自己网站,就可以把这些agent拒之门外。
LilyChen_adada 2016-12-02
  • 打赏
  • 举报
回复
引用 2 楼 luciferisnotsatan 的回复:
返回401这个授权错误么?你在python里怎么绕过的? 一般服务器端返回这错误就是你没有授权,然后客户端发送一个授权(比如,用户名/密码) 抓下报文看看python和C++这两者发送的请求报文具体有哪些区别。
我在python里就是没有管它,直接根据key来取我要的value,就能取出来。

page = json.loads(page_request.content.decode("utf-8"))
self.N=page['search-results']['opensearch:totalResults']
所以是我的APIKey有问题吗?
luciferisnotsatan 2016-12-02
  • 打赏
  • 举报
回复
返回401这个授权错误么?你在python里怎么绕过的? 一般服务器端返回这错误就是你没有授权,然后客户端发送一个授权(比如,用户名/密码) 抓下报文看看python和C++这两者发送的请求报文具体有哪些区别。
振翅高飞 2016-12-02
  • 打赏
  • 举报
回复
建议考虑htmlcxx库解析html
LilyChen_adada 2016-12-02
  • 打赏
  • 举报
回复
引用 9 楼 luciferisnotsatan 的回复:
[quote=引用 8 楼 sinat_34123577 的回复:] 我的headers里面已经包含了我的apikey。我刚才做了一下测试,当我直接在地址栏粘贴https://api.elsevier.com/content/search/scopus?apikey=**********&query=abs(%22heart%20attack%22)时,可以得到我要的XML。(apikey=******是我申请的key),我把这个url放在python里面直接用一句requests.get(),也可以返回我要的内容。但我把python代码好好写,用

        api_resource = "https://api.elsevier.com/content/search/scopus?"
        search_param = 'query=abs("heart attack")'  # for example

        # headers
        headers = dict()
        headers['X-ELS-APIKey'] ='*********'
        headers['X-ELS-ResourceVersion'] = 'XOCS'
        headers['Accept'] = 'application/json'

        # request with first searching page
        page_request = requests.get(api_resource + search_param, headers=headers)
时,print page_request.url得到https://api.elsevier.com/content/search/scopus?query=abs(%22heart%20attack%22,这样点进去就有错了。 你看这个返回的url跟我直接复制粘贴的少了个apikey=*******,有没可能是我的key没有正确的传进去?但是代码还有格式看起来并没有问题呀。
python应该是放在header部分,不是放url里了。 HTTP一个报文header的一个例子 POST /123/index.php HTTP/1.1 Accept: ** Accept-Language: zh-cn host: localhost 红色的是你在浏览器上可以看到的url,后面几行是些关键字/值的组合。一般apikey也会在这里出现,而不是放url里。 你C++有没有调用相关函数加入这个key? [/quote] 没有,就是定义了一个LPCTSTR 然后把所有的内容写成字串,再调用OpenUrl() LPCTSTR header; header="Accept:application/json,X-ELS-APIKey:*****,X-ELS-ResourceVersion:XOCS"; fileGet=(CHttpFile*)session.OpenURL(url,1,1,header);
luciferisnotsatan 2016-12-02
  • 打赏
  • 举报
回复
引用 8 楼 sinat_34123577 的回复:
我的headers里面已经包含了我的apikey。我刚才做了一下测试,当我直接在地址栏粘贴https://api.elsevier.com/content/search/scopus?apikey=**********&query=abs(%22heart%20attack%22)时,可以得到我要的XML。(apikey=******是我申请的key),我把这个url放在python里面直接用一句requests.get(),也可以返回我要的内容。但我把python代码好好写,用

        api_resource = "https://api.elsevier.com/content/search/scopus?"
        search_param = 'query=abs("heart attack")'  # for example

        # headers
        headers = dict()
        headers['X-ELS-APIKey'] ='*********'
        headers['X-ELS-ResourceVersion'] = 'XOCS'
        headers['Accept'] = 'application/json'

        # request with first searching page
        page_request = requests.get(api_resource + search_param, headers=headers)
时,print page_request.url得到https://api.elsevier.com/content/search/scopus?query=abs(%22heart%20attack%22,这样点进去就有错了。 你看这个返回的url跟我直接复制粘贴的少了个apikey=*******,有没可能是我的key没有正确的传进去?但是代码还有格式看起来并没有问题呀。
python应该是放在header部分,不是放url里了。 HTTP一个报文header的一个例子 POST /123/index.php HTTP/1.1 Accept: ** Accept-Language: zh-cn host: localhost 红色的是你在浏览器上可以看到的url,后面几行是些关键字/值的组合。一般apikey也会在这里出现,而不是放url里。 你C++有没有调用相关函数加入这个key?
LilyChen_adada 2016-12-02
  • 打赏
  • 举报
回复
引用 7 楼 luciferisnotsatan 的回复:
[quote=引用 6 楼 sinat_34123577 的回复:] [quote=引用 5 楼 sunyongliang118 的回复:] [quote=引用 3 楼 sinat_34123577 的回复:] [quote=引用 2 楼 luciferisnotsatan 的回复:] 返回401这个授权错误么?你在python里怎么绕过的? 一般服务器端返回这错误就是你没有授权,然后客户端发送一个授权(比如,用户名/密码) 抓下报文看看python和C++这两者发送的请求报文具体有哪些区别。
我在python里就是没有管它,直接根据key来取我要的value,就能取出来。

page = json.loads(page_request.content.decode("utf-8"))
self.N=page['search-results']['opensearch:totalResults']
所以是我的APIKey有问题吗?[/quote] 你的请求报文头是不是没加一些校验项?从回复来看,确实像是缺少授权。 需要模拟登录。[/quote] https://api.elsevier.com/content/search/scopus
引用 4 楼 luciferisnotsatan 的回复:
[quote=引用 3 楼 sinat_34123577 的回复:] [quote=引用 2 楼 luciferisnotsatan 的回复:] 返回401这个授权错误么?你在python里怎么绕过的? 一般服务器端返回这错误就是你没有授权,然后客户端发送一个授权(比如,用户名/密码) 抓下报文看看python和C++这两者发送的请求报文具体有哪些区别。
我在python里就是没有管它,直接根据key来取我要的value,就能取出来。

page = json.loads(page_request.content.decode("utf-8"))
self.N=page['search-results']['opensearch:totalResults']
所以是我的APIKey有问题吗?[/quote] No APIKey provided for request 这个也是server返回的吧。你要有server端的代码或者文档,可以查查到底出了什么问题。 没法查看server端,那么python没问题,CInternetSession这个有问题,那最好抓包看看报文到底有什么区别。比如user-agent,说不定server认python,不认CInternetSession的。像爬虫就会自己标注为爬虫/机器人,然后网站不想爬虫爬自己网站,就可以把这些agent拒之门外。[/quote] 这个是那个网站的API文档https://api.elsevier.com/content/search/scopus,里面也有一些错误的example,但只说是授权或身份验证出了问题。 怎么抓请求报文的信息呀?我不是很懂这个类,要用哪个方法呢?[/quote] 抓包可以用wireshark 但https的话,抓了也是加密的。 你可以看看CInternetSession和python的类本身有没有提供接口,来获取要发送的HTTP报文头部(字符串) 从文档看,说的就是你没权限。查查你的python代码,是不是在哪已经设置了apikey了[/quote] 我的headers里面已经包含了我的apikey。我刚才做了一下测试,当我直接在地址栏粘贴https://api.elsevier.com/content/search/scopus?apikey=**********&query=abs(%22heart%20attack%22)时,可以得到我要的XML。(apikey=******是我申请的key),我把这个url放在python里面直接用一句requests.get(),也可以返回我要的内容。但我把python代码好好写,用

        api_resource = "https://api.elsevier.com/content/search/scopus?"
        search_param = 'query=abs("heart attack")'  # for example

        # headers
        headers = dict()
        headers['X-ELS-APIKey'] ='*********'
        headers['X-ELS-ResourceVersion'] = 'XOCS'
        headers['Accept'] = 'application/json'

        # request with first searching page
        page_request = requests.get(api_resource + search_param, headers=headers)
时,print page_request.url得到https://api.elsevier.com/content/search/scopus?query=abs(%22heart%20attack%22,这样点进去就有错了。 你看这个返回的url跟我直接复制粘贴的少了个apikey=*******,有没可能是我的key没有正确的传进去?但是代码还有格式看起来并没有问题呀。
luciferisnotsatan 2016-12-02
  • 打赏
  • 举报
回复
引用 6 楼 sinat_34123577 的回复:
[quote=引用 5 楼 sunyongliang118 的回复:] [quote=引用 3 楼 sinat_34123577 的回复:] [quote=引用 2 楼 luciferisnotsatan 的回复:] 返回401这个授权错误么?你在python里怎么绕过的? 一般服务器端返回这错误就是你没有授权,然后客户端发送一个授权(比如,用户名/密码) 抓下报文看看python和C++这两者发送的请求报文具体有哪些区别。
我在python里就是没有管它,直接根据key来取我要的value,就能取出来。

page = json.loads(page_request.content.decode("utf-8"))
self.N=page['search-results']['opensearch:totalResults']
所以是我的APIKey有问题吗?[/quote] 你的请求报文头是不是没加一些校验项?从回复来看,确实像是缺少授权。 需要模拟登录。[/quote] https://api.elsevier.com/content/search/scopus
引用 4 楼 luciferisnotsatan 的回复:
[quote=引用 3 楼 sinat_34123577 的回复:] [quote=引用 2 楼 luciferisnotsatan 的回复:] 返回401这个授权错误么?你在python里怎么绕过的? 一般服务器端返回这错误就是你没有授权,然后客户端发送一个授权(比如,用户名/密码) 抓下报文看看python和C++这两者发送的请求报文具体有哪些区别。
我在python里就是没有管它,直接根据key来取我要的value,就能取出来。

page = json.loads(page_request.content.decode("utf-8"))
self.N=page['search-results']['opensearch:totalResults']
所以是我的APIKey有问题吗?[/quote] No APIKey provided for request 这个也是server返回的吧。你要有server端的代码或者文档,可以查查到底出了什么问题。 没法查看server端,那么python没问题,CInternetSession这个有问题,那最好抓包看看报文到底有什么区别。比如user-agent,说不定server认python,不认CInternetSession的。像爬虫就会自己标注为爬虫/机器人,然后网站不想爬虫爬自己网站,就可以把这些agent拒之门外。[/quote] 这个是那个网站的API文档https://api.elsevier.com/content/search/scopus,里面也有一些错误的example,但只说是授权或身份验证出了问题。 怎么抓请求报文的信息呀?我不是很懂这个类,要用哪个方法呢?[/quote] 抓包可以用wireshark 但https的话,抓了也是加密的。 你可以看看CInternetSession和python的类本身有没有提供接口,来获取要发送的HTTP报文头部(字符串) 从文档看,说的就是你没权限。查查你的python代码,是不是在哪已经设置了apikey了
LilyChen_adada 2016-12-02
  • 打赏
  • 举报
回复
引用 5 楼 sunyongliang118 的回复:
[quote=引用 3 楼 sinat_34123577 的回复:] [quote=引用 2 楼 luciferisnotsatan 的回复:] 返回401这个授权错误么?你在python里怎么绕过的? 一般服务器端返回这错误就是你没有授权,然后客户端发送一个授权(比如,用户名/密码) 抓下报文看看python和C++这两者发送的请求报文具体有哪些区别。
我在python里就是没有管它,直接根据key来取我要的value,就能取出来。

page = json.loads(page_request.content.decode("utf-8"))
self.N=page['search-results']['opensearch:totalResults']
所以是我的APIKey有问题吗?[/quote] 你的请求报文头是不是没加一些校验项?从回复来看,确实像是缺少授权。 需要模拟登录。[/quote] https://api.elsevier.com/content/search/scopus
引用 4 楼 luciferisnotsatan 的回复:
[quote=引用 3 楼 sinat_34123577 的回复:] [quote=引用 2 楼 luciferisnotsatan 的回复:] 返回401这个授权错误么?你在python里怎么绕过的? 一般服务器端返回这错误就是你没有授权,然后客户端发送一个授权(比如,用户名/密码) 抓下报文看看python和C++这两者发送的请求报文具体有哪些区别。
我在python里就是没有管它,直接根据key来取我要的value,就能取出来。

page = json.loads(page_request.content.decode("utf-8"))
self.N=page['search-results']['opensearch:totalResults']
所以是我的APIKey有问题吗?[/quote] No APIKey provided for request 这个也是server返回的吧。你要有server端的代码或者文档,可以查查到底出了什么问题。 没法查看server端,那么python没问题,CInternetSession这个有问题,那最好抓包看看报文到底有什么区别。比如user-agent,说不定server认python,不认CInternetSession的。像爬虫就会自己标注为爬虫/机器人,然后网站不想爬虫爬自己网站,就可以把这些agent拒之门外。[/quote] 这个是那个网站的API文档https://api.elsevier.com/content/search/scopus,里面也有一些错误的example,但只说是授权或身份验证出了问题。 怎么抓请求报文的信息呀?我不是很懂这个类,要用哪个方法呢?

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧