在python中确定网站上的网站数量

时间:2010-07-09 05:18:48

标签: python url web-scraping

我有以下链接:

http://www.europarl.europa.eu/sides/getDoc.do?type=REPORT&mode=XML&reference=A7-2010-0001&language=EN

网址的参考部分包含以下信息:

A7 ==议会(现在是第七届议会,前者是A6等等)

2010 ==年

0001 ==凭证编号

对于每年和议会,我想确定网站上的文件数量。例如,对于2010年,数字186,195,196具有空页,而最大数字为214,因此该任务变得复杂。理想情况下,输出应该是包含所有文档编号的向量,不包括缺失的文档编号。

有人能告诉我这是否可以在python中使用?

最好,托马斯

3 个答案:

答案 0 :(得分:3)

首先,确保抓取他们的网站是合法的。

其次,请注意,当文档不存在时,HTML文件包含:

<title>Application Error</title>

第三,使用urllib迭代你想要的所有东西:

for p in range(1,7):
 for y in range(2000, 2011):
  doc = 1
  while True:
    # use urllib to open the url: (root)+p+y+doc
    # if the HTML has the string "application error" break from the while
    doc+=1

答案 1 :(得分:1)

这是一个稍微更完整(但是hacky)的例子似乎有效(使用urllib2) - 我相信你可以根据你的特定需求进行自定义。

我还要重复Arrieta的警告,确保该网站的所有者不介意你抓住它的内容。

#!/usr/bin/env python
import httplib2
h = httplib2.Http(".cache")

parliament = "A7"
year = 2010

#Create two lists, one list of URLs and one list of document numbers.
urllist = []
doclist = []

urltemplate = "http://www.europarl.europa.eu/sides/getDoc.do?type=REPORT&mode=XML&reference=%s-%d-%04u&language=EN"

for document in range(0,9999):
    url = urltemplate % (parliament,year,document)
    resp, content = h.request(url, "GET")
    if content.find("Application Error") == -1:
        print "Document %04u exists" % (document)    
        urllist.append(urltemplate % (parliament,year,document))
        doclist.append(document)
    else:
        print "Document %04u doesn't exist" % (document)
print "Parliament %s, year %u has %u documents" % (parliament,year,len(doclist))

答案 2 :(得分:1)

这是一个解决方案,但在请求之间添加一些超时是一个好主意:

import urllib
URL_TEMPLATE="http://www.europarl.europa.eu/sides/getDoc.do?type=REPORT&mode=XML&reference=A7-%d-%.4d&language=EN"
maxRange=300

for year in [2010, 2011]:
    for page in range(1,maxRange):
        f=urllib.urlopen(URL_TEMPLATE%(year, page))
        text=f.read()
        if "<title>Application Error</title>" in text:
            print "year %d and page %.4d NOT found" %(year, page)
        else:
            print "year %d and page %.4d FOUND" %(year, page)
        f.close()