用Python抓取数据?
我想从这个网站上获取所有的索引词和它们的定义。请问用Python能抓取网页内容吗?
通过Firebug的探索,我发现以下这个网址可以返回我想要的内容,包括字母'a'的索引和定义。
http://pali.hum.ku.dk/cgi-bin/cpd/pali?acti=xart&arid=14179&sphra=undefined
请问需要用到哪些模块?有没有相关的教程可以参考?
我不知道字典里有多少个索引词。我在编程方面完全是个新手。
2 个回答
你可以使用内置的urllib或urllib2从网上获取数据,但最重要的部分是解析数据。这里我推荐一个很棒的工具,叫做BeautifulSoup,它几乎可以处理任何情况。http://www.crummy.com/software/BeautifulSoup/
它的文档就像一个教程,挺简单的。大概是这样的:http://www.crummy.com/software/BeautifulSoup/documentation.html
在你的情况下,你可能需要使用通配符来查看字典中的所有条目。你可以这样做:
import urllib2
def getArticles(query, start_index, count):
xml = urllib2.urlopen('http://pali.hum.ku.dk/cgi-bin/cpd/pali?' +
'acti=xsea&tsearch=%s&rfield=entr&recf=%d&recc=%d' %
(query, start_index, count))
# TODO:
# parse xml code here (using BeautifulSoup or an xml parser like Python's
# own xml.etree. We should at least have the name and ID for each article.
# article = (article_name, article_id)
return (article_names # a list of parsed names from XML
def getArticleContent(article):
xml = urllib2.urlopen('http://pali.hum.ku.dk/cgi-bin/cpd/pali?' +
'acti=xart&arid=%d&sphra=undefined' % article_id)
# TODO: parse xml
return parsed_article
现在你可以开始循环处理这些数据了。例如,如果你想获取所有以'ana'开头的文章,可以使用通配符'ana*',然后循环直到没有结果为止:
query = 'ana*'
article_dict = {}
i = 0
while (true):
new_articles = getArticles(query, i, 100)
if len(new_articles) == 0:
break
i += 100
for article_name, article_id in new_articles:
article_dict[article_name] = getArticleContent(article_id)
完成后,你将得到一个包含所有文章内容的字典,条目是通过名称来引用的。我没有详细讲解析的部分,但在这种情况下其实很简单,因为所有内容都是XML格式。你甚至可能不需要使用BeautifulSoup(尽管它在处理XML时依然很方便且易于使用)。
不过有一点需要注意:在大量抓取文章之前,你应该查看一下网站的使用政策(也许还要看看robots.txt)。如果你只是想获取几篇文章,网站可能不会太在意(但如果字典的版权归某个特定人所有,而不是公共领域,那他们可能会在意),但如果你打算抓取整个字典,那就会是很大的使用量了。
你应该使用 urllib2 来获取网址的内容,使用 BeautifulSoup 来解析HTML或XML格式的内容。
举个例子 - 从StackOverflow.com的主页获取所有问题:
import urllib2
from BeautifulSoup import BeautifulSoup
page = urllib2.urlopen("http://stackoverflow.com")
soup = BeautifulSoup(page)
for incident in soup('h3'):
print [i.decode('utf8') for i in incident.contents]
print
这个代码示例是根据 BeautifulSoup的文档 修改而来的。