乐者为王

Do one thing, and do it well.

使用Scrapy爬取小说(4)

使用Scrapy爬取小说(1)中,我们使用range(1, 310)来确定章节链接的范围,这很不好。我们编程的时候应该要尽量注意减少代码中的硬编码和魔数,提高代码的可移植性。如果小说章节的链接不是这种连续的数字,或者章节的数量是在逐步增加的,那么这段代码就是无效的,或者会慢慢变得无效。

如何才能把这段代码写得更具可移植性呢?

novel-chapter-urls

我们不必关心章节链接的格式,我们只要知道它是个链接,一定是以<a href="url">text</a>这种形式呈现(如上图所示)。我们也不必关心章节数量是否变化,只要把所有这种形式的链接抓取下来即可。与此对应的XPath表达式是:

1
//center/table[@bordercolorlight]//a/@href

因为页面文档中可能有多个表格,所以要在table后面添加@bordercolorlight属性来指定我们要查找的那个。

那么在Scrapy中如何实现这样的能力呢?以下是具体的代码:

1
2
3
4
5
def parse(self, response):
  links = response.xpath('//center/table[@bordercolorlight]//a/@href').extract()
  for link in links:
    next = response.urljoin(link)
    yield scrapy.Request(next, callback=self.parse_chapter)

Comments