urllib2动态加载内容行为不端

时间:2012-11-27 09:00:38

标签: python html ajax python-3.x urllib2

部分代码

headers = {}
headers['user-agent'] = 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0'
headers['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
headers['Accept-Language'] = 'en-gb,en;q=0.5'
#headers['Accept-Encoding'] = 'gzip, deflate'

request = urllib.request.Request(sURL, headers = headers)
try:
    response = urllib.request.urlopen(request)
except error.HTTPError as e:
    print('The server couldn\'t fulfill the request.')
    print('Error code: {0}'.format(e.code))
except error.URLError as e:
    print('We failed to reach a server.')
    print('Reason: {0}'.format(e.reason))
else:
    f = open('output/{0}.html'.format(sFileName),'w')
    f.write(response.read().decode('utf-8'))

网址

http://groupon.cl/descuentos/santiago-centro

情况

这就是我的所作所为:

  1. 在浏览器中启用javascript
  2. 打开上面的网址并密切关注控制台
  3. 禁用javascript
  4. 重复步骤2(对于刚刚调整过的人,javascript现已被禁用)
  5. 使用urllib2抓取网页并将其保存到文件
  6. 启用javascript
  7. 使用浏览器打开文件并观察控制台
  8. 使用javascript off重复7
  9. 结果

    • 在第2步中,我看到使用ajax动态加载了大量页面内容。所以到达的HTML是一种骨架,ajax用于填补空白。这很好,并不奇怪

    • 由于页面应该是seo友好的,它应该没有js工作正常。在步骤4中,控制台中没有任何反应,骨架页面加载预先填充的渲染,不需要ajax。这也完全没有混淆

    • 在步骤7中进行了ajax调用但失败了。这也没关系,因为他们使用的网址不是本地的,因此呼叫被破坏了。该页面看起来像骨架。这也很棒,也很期待。

    • 步骤8中的
    • :没有进行ajax调用,骨架只是一个骨架。我原以为这应该与第4步非常相似

    问题

    我想要做的是使用urllib2从步骤4中获取html,但我无法弄清楚如何。 我错过了什么,我该如何解决这个问题?

    解释

    如果我正在编写蜘蛛,我希望能够抓住普通的HTML(就像导致第4步的那样)。我不想执行ajax的东西或任何javascript。我不想动态填充任何内容。我只想要HTML。

    seo友好网站希望我得到我想要的东西,因为这就是seo的全部意义。

    根据我概述的情况,如何获得纯HTML内容?

    要手动完成,我会关闭js,导航到页面,查看源代码,ctrl-a,ctrl-c,ctrl-v(某处有用)。

    要获得一个脚本来为我做这件事我会......?

    我试过的东西

    我使用wireshark查看数据包标题,并且在步骤2和4中从我的电脑发送的GET具有相同的标题。阅读SEO的东西让我觉得这很正常,否则不会使用像hijax这样的技术。

    以下是我的浏览器发送的标题:

    Host: groupon.cl
    User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-gb,en;q=0.5
    Accept-Encoding: gzip, deflate
    Connection: keep-alive
    

    以下是我的脚本发送的标头:

    Accept-Encoding: identity
    Host: groupon.cl
    Accept-Language: en-gb,en;q=0.5
    Connection: close
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    User-Agent: User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0
    

    区别在于:

    • 我的脚本有Connection = close而不是keep-alive。我无法看出这会导致问题
    • 我的脚本有Accept-encoding = identity。这可能是问题的原因。我真的不明白为什么主机会使用这个字段来确定用户代理。如果我更改编码以匹配浏览器请求标头,那么我无法解码它。我现在正在努力......

    观看这个空间,我会在新信息出现时更新问题

0 个答案:

没有答案