我正在解析一些sitemap的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标头。 我在考虑这样的事情:
...
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'
对于如何解决这个问题的任何想法或想法都将非常感激。
答案 0 :(得分:1)
应该适合你:
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
你的脚本应该正常工作......看起来你已经用xml var交换了url var,这只是有点混乱。