如何抓取仅在给定域URL的站点

Dav*_*son 5 python web-crawler scrapy scrape

我正在尝试使用scrapy爬行网站,但是该网站没有站点地图或页面索引。如何抓取抓取网站的所有页面?

我只需要下载网站的所有页面,而无需提取任何项目。我是否只需要设置“蜘蛛规则”中的所有链接?但是我不知道scrapy是否会以这种方式避免重复的url。

Dav*_*son 5

我刚刚自己找到了答案。有了CrawlSpider类,我们只需要allow=()SgmlLinkExtractor函数中设置变量。正如文档所说

允许(正则表达式(或列表))–(绝对)url 必须匹配才能提取的单个正则表达式(或正则表达式列表)。如果没有给出(或为空),它将匹配所有链接。


jpy*_*ams 5

在您的 中Spider,定义allowed_domains为您要爬网的域列表。

class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    allowed_domains = ['quotes.toscrape.com']
Run Code Online (Sandbox Code Playgroud)

然后您可以使用response.follow()以下链接。请参阅Spiders 文档教程

或者,您可以使用 a 过滤域LinkExtractor(如David Thompson 提到的)。

from scrapy.linkextractors import LinkExtractor

class QuotesSpider(scrapy.Spider):

    name = 'quotes'
    start_urls = ['http://quotes.toscrape.com/page/1/']

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.css('small.author::text').get(),
                'tags': quote.css('div.tags a.tag::text').getall(),
            }
        for a in LinkExtractor(allow_domains=['quotes.toscrape.com']).extract_links(response):
            yield response.follow(a, callback=self.parse)
Run Code Online (Sandbox Code Playgroud)