使用Scrapy抓取多个域而无需纵横交错
我设置了一个CrawlSpider来聚合所有出站链接(start_urls
例如,仅从特定深度进行爬网DEPTH_LIMIT = 2
)。
class LinkNetworkSpider(CrawlSpider):
name = "network"
allowed_domains = ["exampleA.com"]
start_urls = ["http://www.exampleA.com"]
rules = (Rule(SgmlLinkExtractor(allow=()), callback='parse_item', follow=True),)
def parse_start_url(self, response):
return self.parse_item(response)
def parse_item(self, response):
hxs = HtmlXPathSelector(response)
links = hxs.select('//a/@href').extract()
outgoing_links = []
for link in links:
if ("http://" in link):
base_url = urlparse(link).hostname
base_url = base_url.split(':')[0] # drop ports
base_url = '.'.join(base_url.split('.')[-2:]) # remove subdomains
url_hit = sum(1 for i in self.allowed_domains if base_url not in i)
if url_hit != 0:
outgoing_links.append(link)
if outgoing_links:
item = LinkNetworkItem()
item['internal_site'] = response.url
item['out_links'] = outgoing_links
return [item]
else:
return None
我想将其扩展到多个域(exampleA.com,exampleB.com,exampleC.com
…)。起初,我以为我可以将列表也添加到start_urls
,allowed_domains
但是我认为这会导致以下问题:
- 设置
DEPTH_LIMIT
将应用于每个start_urls
/allowed_domain
吗? - 更重要的是:如果站点已连接,则蜘蛛会从exampleA.com跳到exampleB.com,因为两者都在allowed_domains中?我需要避免这种纵横交错,因为我以后想对每个站点的出站链接进行计数,以获得有关网站之间关系的信息!
那么,如何在不出现 纵横交错 的问题以及每个网站使用设置的情况下 扩展 更多的蜘蛛呢? __
显示我想要实现的其他图像:
-
我现在没有规则就实现了它。我
meta
为每个属性都附加了一个属性start_url
,然后简单地检查一下自己是否链接属于原始域,并相应地发出新请求。因此,请覆盖
start_requests
:def start_requests(self): return [Request(url, meta={'domain': domain}, callback=self.parse_item) for url, domain in zip(self.start_urls, self.start_domains)]
在随后的解析方法中,我们获取
meta
属性domain = response.request.meta['domain']
,将域与提取的链接进行比较,然后自己发出新请求。