我在scrapy蜘蛛中有以下代码:
class ContactSpider(Spider):
name = "contact"
# allowed_domains = ["http://www.domain.com/"]
start_urls = [
"http://web.domain.com/DECORATION"
]
BASE_URL = "http://web.domain.com"
def parse(self, response):
links = response.selector.xpath('//*[contains(@class,"MAIN")]/a/@href').extract()
for link in links:
absolute_url = self.BASE_URL + link
yield Request(absolute_url, headers= headers, callback=self.second)
我很惊讶scrapy中没有更简单的方法来跟踪链接而不是构建每个absolute_url。有没有更好的方法来做到这一点?
答案 0 :(得分:1)
对于绝对网址,您可以使用urlparse.urljoin
,Response
已经通过response.urljoin(link)
设置了快捷方式。因此,您的代码很容易被替换为:
def parse(self, response):
links = response.selector.xpath('//*[contains(@class,"MAIN")]/a/@href').extract()
for link in links:
yield Request(response.urljoin(link), headers=headers, callback=self.second)
您还可以使用scrapy LinkExtractors
根据某些规则提取链接并自动管理所有加入。
from scrapy.linkextractors import LinkExtractor
def parse(self, response):
le = LinkExtractor(restrict_xpaths='//*[contains(@class,"MAIN")]/a/@href')
links = le.extract_links(response)
for link in links:
yield Request(link.url, headers= headers, callback=self.second)
关于更自动化的抓取体验 - scrapy有CrawlSpider
,它使用一组规则来提取和关注每个页面上的链接。你可以在这里阅读更多信息:http://doc.scrapy.org/en/latest/topics/spiders.html#crawlspider
文档中也有一些例子。