2012-03-05 88 views
18

我想使用Python Scrapy module来刮掉我网站上的所有URL并将列表写入文件。我看了一些例子,但没有看到一个简单的例子来做到这一点。如何使用Python Scrapy模块列出来自我网站的所有网址?

+6

的StackOverflow是不是一个网站,请人编写代码为你 - *尝试一些*,然后来问一个关于一个问题你遇到的具体问题。 – Amber 2012-03-05 02:47:16

+0

你有试过那里的教程吗?这是相当自我解释。如果你/有/尝试过教程,仍然有问题,请尝试发布一些你先试过的代码(+1 @Amber) – inspectorG4dget 2012-03-05 02:58:41

+3

琥珀色和inspectorG4dget,我写了这样做的程序,但不能发布它因为我没有足够的声望 - 有一段等待时间。明天早上我会发布解决方案。 – 2012-03-05 06:16:22

回答

40

这里是为我工作的Python程序:

from scrapy.selector import HtmlXPathSelector 
from scrapy.spider import BaseSpider 
from scrapy.http import Request 

DOMAIN = 'example.com' 
URL = 'http://%s' % DOMAIN 

class MySpider(BaseSpider): 
    name = DOMAIN 
    allowed_domains = [DOMAIN] 
    start_urls = [ 
     URL 
    ] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     for url in hxs.select('//a/@href').extract(): 
      if not (url.startswith('http://') or url.startswith('https://')): 
       url= URL + url 
      print url 
      yield Request(url, callback=self.parse) 

保存在一个名为spider.py文件。

然后,您可以使用一个管道来进行后期处理这样的文字:

bash$ scrapy runspider spider.py > urls.out 
bash$ cat urls.out| grep 'example.com' |sort |uniq |grep -v '#' |grep -v 'mailto' > example.urls 

这让我在我的站点中的所有独特的URL列表。

+2

很酷。你已经得到了答案。现在继续,接受答案......哦,是的,可能会有一个“自我学习者”徽章等着你。 :) – Nishant 2012-03-06 04:34:55

+0

这个程序有一个小错误。 'if not not url.startswith('http://'):'不会正确处理https链接。 – 2015-06-27 17:24:05

+0

@JoshuaSnider我更新了它。但这是示例代码的一小段代码,所以它并不意味着对所有情况都是权威的。 – 2015-06-27 22:18:16

12

吸尘器(也许更有用的)东西会使用LinkExtractor

from scrapy.linkextractors import LinkExtractor 

    def parse(self, response): 
     le = LinkExtractor() # empty for getting everything, check different options on documentation 
     for link in le.extract_links(response): 
      yield Request(link.url, callback=self.parse) 
+0

这是否会返回网站内部或外部的链接? – 2016-09-06 09:30:56

相关问题