用 headers 解析 XML

Parsing XML with headers

我正在解析一些站点地图 xml,我偶然发现了一个实施了 cloudflare ddos​​ 保护的站点。我最初有这样的东西:

from xml.dom import minidom
import urllib, urllib2

url='http://rsvpgallery.com/sitemap_products_1.xml?from=1&to=9999999999'
xml = urllib.urlopen(url).read()

检查 xml 变量,我们可以看到它导致了 cloudflare 保护页面,并且该站点已根据我的浏览器签名禁止我访问。

为了解决这个问题,我想添加一个 User-Agent header。 我在想这样的事情:

...
req = urllib2.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/47.0.2526.106 Chrome/47.0.2526.106 Safari/537.36')
resp = urllib2.urlopen(req)
url = resp.read()
...

但是当我用这个新的 url 变量声明 xml 时,我得到了这个错误:

 xml = urllib.urlopen(url).read()
  File "/usr/lib/python2.7/urllib.py", line 87, in urlopen
    return opener.open(url)
  File "/usr/lib/python2.7/urllib.py", line 205, in open
    return self.open_unknown(fullurl, data)
  File "/usr/lib/python2.7/urllib.py", line 217, in open_unknown
    raise IOError, ('url error', 'unknown url type', type)
IOError: [Errno url error] unknown url type: '?xml%20version=%221.0%22%20encoding=%22utf-8%22?%3e%0a%3curlset%20xmlns=%22http'

任何关于如何解决这个问题的想法或想法将不胜感激。

它应该适合你:

from xml.dom import minidom
import urllib2 as net

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:43.0) Gecko/20100101 Firefox/43.0',
}

url='http://rsvpgallery.com/sitemap_products_1.xml?from=1&to=9999999999'
req = net.Request(url, headers=headers)
xml = net.urlopen(req).read()

print xml

你的脚本无论如何都应该工作...你似乎已经将 url var 替换为 xml var,只是有点混乱。