使用urllib.request.urlopen会返回空白,但是从Chrome中我可以看到响应中有数据

时间:2015-12-12 10:29:25

标签: python

这是我的第一个问题,并且感谢您可以向我提供一些提示。

我正在使用python开发一个蜘蛛来抓取网站的赔率条目。在该网站中,有一个onclick事件可以弹出一个窗口来显示赔率的变化。我在Chrome上检查了它是否链接到了网址," http://odds.500.com/fenxi1/inc/yazhiajax.php?fid=554629&id=3&t=" + str(t)+"& r = 1" 这里t是一个Javascript(新日期).getTime()。我可以看到Chrome的预览和响应中的赔率变化。但是,当我在代码下面运行以获取数据时。它显示为空白。当我通过Chrome导航到网址时,它显示为空白。

enter image description here

import datetime
import re
import urllib.request
import lottery
import gzip
import time

# getTime simulates Javascript getTime function
def getTime():
    return int(time.time() * 1000)

user_agent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'"
referer = "http://odds.500.com/fenxi/yazhi-554629.shtml"
headers = {'User-Agent': user_agent, 'Referer': referer}

t = getTime()
url_str = "http://odds.500.com/fenxi1/inc/yazhiajax.php?fid=554629&id=3&t=" + str(t) + "&r=1"
print(url_str)
req = urllib.request.Request(url_str, headers = headers)
response = urllib.request.urlopen(req).read()
print(response)

3 个答案:

答案 0 :(得分:1)

HTTP请求不仅包含URL。您可以在Chrome的“开发人员”工具(ctrl + shift + I)中查看“网络”标签中的所有请求和响应。

我在Chrome中打开了您的引荐网址(http://odds.500.com/fenxi/yazhi-554629.shtml)并点击了"盘"中的一个项目。柱。我相信这就是你想要模仿的东西。它发送了一个包含许多cookie的请求。那可能是你的问题。

您可能应该让您的抓取工具打开第一个网址,收集所有Cookie,然后使用Cookie进行第二次重新设置。

但这可能是一个挑战,取决于你需要做些什么来收集cookie。

另请注意,当您的响应不是完整的HTML文档时 - 它是HTML段的JSON列表。

编辑:找到答案

我不得不再次检查标题。如果您只是添加此标题,则会收到回复:X-Requested-With: XMLHttpRequest。所以:

url = 'http://odds.500.com/fenxi1/inc/yazhiajax.php?fid=554629&id=3&t=1449930953112&r=1'
headers = {'X-Requested-With': 'XMLHttpRequest'}
urllib.request.urlopen(urllib.request.Request(url, headers=headers)).read()

它会返回一些二进制数据......我会留给您解码。提示:respnse标题说Content-Encoding:gzip,所以它是压缩的......

答案 1 :(得分:0)

使用正确的标头可以解决问题。请尝试检查以下标题:

headers = {
                        'Host': "twitter.com",
                        'User-Agent': "Mozilla/5.0 (Windows NT 6.1; Win64; x64)",
                        'Accept': "application/json, text/javascript, */*; q=0.01",
                        'Accept-Language': "de,en-US;q=0.7,en;q=0.3",
                        'X-Requested-With': "XMLHttpRequest",
                        'Referer': url,
                        'Connection': "keep-alive"
                }

答案 2 :(得分:-1)

我宁愿使用urllib3

使用urllib3获取页面:

   import urllib3
   url = http://odds.500.com/fenxi1/inc/yazhiajax.php?fid=554629&id=3&t=" + str(t) + "&r=1"
   http = urllib3.PoolManager()
   page = http.request('GET',url)

你有你的页面。