urllib2 任意拉取不同的页面

urllib2 pulls a different page arbitrarily

我正试图为此 url 制作一个 bs4 抓取器,当我意识到它有时有效而其他人看似随意时却无效。

所以,我在这里编写了一些代码(您不必全部阅读):

import urllib2
import sys
from bs4 import BeautifulSoup

class RedirectHandler(urllib2.HTTPRedirectHandler):
    def http_error_302(self, req, fp, code, msg, headers):
        result = urllib2.HTTPError(req.get_full_url(), code, msg, headers, fp)
        result.status = code
        return result

def pullPage():
    url = "http://shop.nordstrom.com/s/tory-burch-caroline-ballerina-flat-women/3152313?origin=category-personalizedsort&contextualcategoryid=0&fashionColor=Camellia+Pink+Beige&resultback=441"
    hdr = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
            'Accept-Encoding': 'none',
            'Accept-Language': 'en-US,en;q=0.8',
            'Connection': 'keep-alive'} 
    req = urllib2.Request(url,headers=hdr)
    try:
        opener = urllib2.build_opener(RedirectHandler())
        webpage = opener.open(req)
        soup = BeautifulSoup(webpage, "html5lib")
        return str(soup)
    except Exception,e:
        print str(e)
        if '403' in str(e):
            sys.exit("This scraper is forbidden from this site")
        elif '[Errno -2]' in str(e):
            sys.exit("This program can not connect to the internet")
        sys.exit('Broken URL')

happy = 1
while(happy < 10):
    print len(pullPage())
    happy = happy + 1

这个程序打印出网站HTML中的字符数10次。这是输出

218531
218524
377646
218551
377646
218559
218547
376938
218552

有谁知道为什么这个网站的代码有时看起来几乎翻了一番,而其他网站却没有?有没有什么方法可以等到整个页面加载完毕?

我认为重点代码是这些行:

webpage = opener.open(req)
soup = BeautifulSoup(webpage, "html5lib")

编辑 1: 其他人可以 运行 这段代码让我知道他们的结果是否相似吗?

编辑 2: 我在另一台机器上(在 google 服务器上)重新 运行 这段代码得到了类似的结果:

218565
218564
376937
376487
378243
218564
218557
378248
377791

可能有很多原因:

  • 可能是他们正在使用 A/B 测试来检查变化
  • 可能是他们有一个分层结构,并不是所有的后端服务器都是对齐的
  • 可能是想阻止别人盗窃转卖目录
  • 可能是您使用的代理很有趣
  • 可能是某些防病毒软件正试图帮助您
  • 可能是您的机器感染了注入html内容的病毒