如何使用Python Scrapy模块列出我的网站上的所有URL?

24

我想使用Python的Scrapy模块从我的网站爬取所有的URL,并将列表写入文件。我查看了示例,但没有看到任何简单的示例可以完成这个任务。


7
StackOverflow 不是一个让别人为你编写代码的网站 - 你应该先尝试一些东西,然后在遇到具体问题时再提出问题。请勿直接抄袭代码。 - Amber
你尝试过那里的教程吗?它相当易于理解。如果你已经尝试了教程,但仍然有困难,请先发布一些你尝试过的代码(+1 @Amber)。 - inspectorG4dget
3
Amber和inspectorG4dget,我编写了实现此功能的程序,但由于声望不足,我无法发布它-还需要等待一段时间。我明天上午会发布解决方案。 - Adam F
2个回答

52

这是适用于我的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的文件中。

然后,您可以使用shell管道来对此文本进行后处理:

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

这将为我提供站点中所有唯一 URL 的列表。


4
太棒了,你得到了答案。现在请接受答案......哦对了,可能会有一个“自学者”徽章等着你。 :) - Nishant
1
这个程序有一个小bug。这一行代码 if not url.startswith('http://'): 无法正确处理 https 链接。 - Joshua Snider
@JoshuaSnider 我已经更新了它。但这只是一个简短的示例代码片段,所以并不意味着适用于所有情况。 - Adam F

15

更为简洁(也许更有用)的方法是使用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)

这会返回网站内部的链接,还是外部的链接也会返回? - Mr Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接