我正在尝试使用 scrapy 来抓取网站,但该网站没有站点地图或页面索引。如何用scrapy抓取网站的所有页面?
我只需要下载网站的所有页面而不提取任何项目。我只需要设置跟随蜘蛛规则中的所有链接吗?但我不知道scrapy是否会以这种方式避免复制url。
我正在尝试使用 scrapy 来抓取网站,但该网站没有站点地图或页面索引。如何用scrapy抓取网站的所有页面?
我只需要下载网站的所有页面而不提取任何项目。我只需要设置跟随蜘蛛规则中的所有链接吗?但我不知道scrapy是否会以这种方式避免复制url。
我自己找到了答案。有了这个CrawlSpider
类,我们只需要allow=()
在SgmlLinkExtractor
函数中设置变量。正如文档所说:
allow (a regular expression (or list of)) – 一个正则表达式(或正则表达式列表),(绝对)url 必须匹配才能被提取。如果未给出(或为空),它将匹配所有链接。
在您的Spider
中,定义allowed_domains
为您要抓取的域列表。
class QuotesSpider(scrapy.Spider):
name = 'quotes'
allowed_domains = ['quotes.toscrape.com']
然后,您可以使用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)