我有一个奇怪的问题,解析网页Herald Sun以获取其中的rss列表。当我在浏览器中查看网页时,我可以看到带有标题的链接。但是,当我使用Python和Beautiful Soup来解析页面时,响应甚至没有我要解析的部分。
hdr = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9) AppleWebKit/537.71 (KHTML, like Gecko) Version/7.0 Safari/537.71',
'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 = urllib.request.Request("http://www.heraldsun.com.au/help/rss", headers=hdr)
try:
page = urllib.request.urlopen(req)
except urllib.error.HTTPError as e:
print(e.fp.read())
html_doc = page.read()
f = open("Temp/original.html", 'w')
f.write(html_doc.decode('utf-8'))
您可以检查的书面文件中没有结果,所以很明显,Beautiful Soup在这里无关。
我想知道,网页如何实现这种保护以及如何克服它?谢谢,
答案 0 :(得分:1)
对于商业用途,请先阅读服务条款
服务器确实知道谁提出此请求的信息并不多。 IP,User-Agent或Cookie ...有时urllib2不会获取JavaScript生成的信息。
JavaScript还是不?
(1)您需要打开chrome开发人员并禁用缓存和Javascript以确保您仍然可以看到所需的信息。如果你看不到那里的信息,你必须使用一些支持Javascript的工具,如Selenium或PhantomJS。
但是,在这种情况下,您的网站看起来并不复杂。
<强> 用户代理?饼干吗?的 (2)然后问题最终调整用户代理或Cookie。正如您之前尝试过的那样,用户代理似乎还不够。然后它将是将发挥作用的cookie。
如您所见,第一页调用实际上返回暂时不可用,您需要单击带有200返回码的rss HTML。您只需要从那里复制用户代理和cookie,它就可以工作。
以下是使用urllib2
添加cookie的代码import urllib2, bs4, re
opener = urllib2.build_opener()
opener.addheaders = [("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36")]
# I omitted the cookie here and you need to copy and paste your own
opener.addheaders.append(('Cookie', 'act-bg-i...eat_uuniq=1; criteo=; pl=true'))
soup = bs4.BeautifulSoup(opener.open("http://www.heraldsun.com.au/help/rss"))
div = soup.find('div', {"id":"content-2"}).find('div', {"class":"group-content"})
for a in div.find_all('a'):
try:
if 'feeds.news' in a['href']:
print a
except:
pass
以下是产出:
<a href="http://feeds.news.com.au/heraldsun/rss/heraldsun_news_breakingnews_2800.xml">Breaking News</a>
<a href="http://feeds.news.com.au/heraldsun/rss/heraldsun_news_topstories_2803.xml">Top Stories</a>
<a href="http://feeds.news.com.au/heraldsun/rss/heraldsun_news_worldnews_2793.xml">World News</a>
<a href="http://feeds.news.com.au/heraldsun/rss/heraldsun_news_morenews_2794.xml">Victoria and National News</a>
<a href="http://feeds.news.com.au/heraldsun/rss/heraldsun_news_sport_2789.xml">Sport News</a>
...
答案 1 :(得分:0)
网站很可能会提供不同的内容,具体取决于标头中的User-Agent
字符串。例如,网站通常会为移动浏览器执行此操作。
由于您未指定一个,urllib
将使用其默认值:
默认情况下,URLopener类发送urllib / VVV的User-Agent标头,其中VVV是urllib版本号。
您可以按照advice in this question尝试欺骗常见的用户代理字符串。见What's My User Agent?