2011-07-11 123 views
1

我想写一个使用Python的爬虫。这意味着:我已经获得了某些网站的主页的网址,并且我希望我的程序可以通过访问网站的链接抓取所有网站。我怎样才能轻松快速地做到这一点?我已经尝试了BeautifulSoup,但它真的是CPU消耗,而且在我的电脑上很慢。Python的爬虫?

+0

经常讨论......看看处理“scrapy”的SO问题 –

回答

4

我推荐使用机械化与lxml.html组合。正如罗伯特国王建议的那样,机械化可能是通过该网站进行导航的最佳选择。提取元素我会使用lxml。 lxml比BeautifulSoup快得多,可能是Python可用的最快解析器。 this link显示了python不同html解析器的性能测试。我个人不会使用scrapy包装。

我还没有测试过,但这可能是你要找的东西,第一部分是直接从mechanize documentationthe lxml documentation也相当有帮助。特别看看thisthis部分。

import mechanize 
import lxml.html 

br = mechanize.Browser() 
response = br.open("somewebsite") 

for link in br.links(): 
    print link 
    br.follow_link(link) # takes EITHER Link instance OR keyword args 
    print br 
    br.back() 

# you can also display the links with lxml 
html = response.read() 
root = lxml.html.fromstring(html) 
for link in root.iterlinks(): 
    print link 

您还可以通过root.xpath()获取元素。一个简单的wget甚至可能是最简单的解决方案。

希望我能帮到你。

+0

我不认为第一个for循环正在做你打算做的事情。 – cerberos

+0

我迄今为止只使用机械化来浏览表格。它不是简单地打印网站上的每个链接,然后按照它? br.back可能是不必要的。但在我看来,它的确如此。帖子[这里](http://stackoverflow.com/questions/3569622/python-mechanize-follow-link-by-url-and-what-is-the-nr-parameter)是相似的。但是由于我对Python /编程一般都很陌生,如果我错了,请纠正我。 – ilprincipe

+0

无论如何,我开始使用lxml,一切都变得更快!谢谢! –

1

看一看scrapy(和related questions)。至于性能......很难在看不到代码的情况下提出任何有用的建议。

2

我喜欢使用机械化。它非常简单,你下载它并创建一个浏览器对象。有了这个对象,你可以打开一个URL。您可以像在普通浏览器中一样使用“后退”和“前进”功能。您可以遍历页面上的表单并在需要时填写表单。 您也可以迭代页面上的所有链接。每个链接对象都有你可以点击的网址等。

这里有一个例子: Download all the links(related documents) on a webpage using Python