1

一些代码

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. 打开上面的 url 并留意控制台
  3. 禁用 javascript
  4. 重复第 2 步(对于那些刚刚收听的人,javascript 现在已被禁用)
  5. 使用 urllib2 抓取网页并将其保存到文件中
  6. 启用 javascript
  7. 用浏览器打开文件并观察控制台
  8. 在关闭 javascript 的情况下重复 7

结果

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

  • 由于页面应该是 seo 友好的,它应该可以在没有 js 的情况下正常工作。在第 4 步中,控制台中什么也没有发生,并且骨架页面加载了预先填充的渲染 ajax 不必要的内容。这也完全没有混淆

  • 在第 7 步中,进行了 ajax 调用但失败了。这也可以,因为他们使用的 url 不是本地的,因此调用会中断。页面看起来像骨架。这也很棒,也很值得期待。

  • 在第 8 步中:不进行 ajax 调用,并且骨架只是一个骨架。我原以为这应该非常像第 4 步

问题

我想要做的是使用 urllib2 从步骤 4 中获取 html,但我不知道如何。我错过了什么,我怎么能做到这一点?

转述

如果我正在编写一个蜘蛛,我希望能够抓取纯 ol' 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。这可能是问题的原因。我真的不明白为什么主机会使用这个字段来确定用户代理。如果我更改编码以匹配浏览器请求标头,那么我将无法解码它。我现在正在处理这个...

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

4

0 回答 0