我尝试使用Scrapy从页面中提取所有链接,但我正在努力使用LinkExtractor。我尝试过以下方法:
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from Funda.items import FundaItem
class FundaSpider(scrapy.Spider):
name = "Funda"
allowed_domains = ["funda.nl"]
start_urls = [
"http://www.funda.nl/koop/amsterdam/"
]
rules = (
Rule(LinkExtractor(), callback='parse_item')
)
def parse_item(self, response):
filename = response.url.split("/")[-2] + '.html'
with open(filename, 'wb') as f:
f.write(response.body)
我的理解是,将LinkExtractor()
作为Rule
包括response
只包含链接。但是,如果我查看这样生成的amsterdam.html
文件,它似乎仍然包含整个网页,而不仅仅是链接。
如何让response
仅包含链接?
答案 0 :(得分:4)
为什么你认为它只包含链接?
我认为你误解了CrawlSpider
和rule
这个论点。在rule
内,您实际上指定了爬网逻辑而不是解析逻辑。正在使用callback
指定的函数处理解析。
因此,如果您希望仅保存响应中的链接,则必须先从响应中提取它们。您甚至可以使用相同的LinkExtractor
class Spider(scrapy.Spider):
name = 'spider1'
le1 = LinkExtractor()
rules = (
Rule(le1, callback='parse_item')
)
def parse_item(self, response):
# this will give you Link objects
links = self.le1.extract_links(response)
# this will give you html nodes of <a>
links = response.xpath("//a").extract()