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内容的病毒
我正试图为此 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内容的病毒