使用浏览器打开时,无法解析可见的网页的一部分

时间:2013-12-05 00:14:27

标签: python parsing html-parsing beautifulsoup urllib

我有一个奇怪的问题,解析网页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在这里无关。

我想知道,网页如何实现这种保护以及如何克服它?谢谢,

2 个答案:

答案 0 :(得分:1)

对于商业用途,请先阅读服务条款

服务器确实知道谁提出此请求的信息并不多。 IP,User-Agent或Cookie ...有时urllib2不会获取JavaScript生成的信息。

JavaScript还是不?

(1)您需要打开chrome开发人员并禁用缓存和Javascript以确保您仍然可以看到所需的信息。如果你看不到那里的信息,你必须使用一些支持Javascript的工具,如Selenium或PhantomJS。 enter image description here

但是,在这种情况下,您的网站看起来并不复杂。

<强> 用户代理?饼干吗?的 (2)然后问题最终调整用户代理或Cookie。正如您之前尝试过的那样,用户代理似乎还不够。然后它将是将发挥作用的cookie。

enter image description here

如您所见,第一页调用实际上返回暂时不可用,您需要单击带有200返回码的rss HTML。您只需要从那里复制用户代理和cookie,它就可以工作。

enter image description here

以下是使用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?