gpt4 book ai didi

python - 用Scrapy爬取多个域不交叉

转载 作者:行者123 更新时间:2023-11-28 22:49:07 25 4
gpt4 key购买 nike

我已经设置了一个 CrawlSpider 来聚合所有出站链接(通过例如 DEPTH_LIMIT = 2start_urls 仅爬取一定深度)。

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 中?我需要避免这种交叉,因为稍后我想统计每个网站的出站链接,以获取有关网站之间关系的信息!

那么我如何才能扩展更多蜘蛛而不遇到交叉问题并使用每个网站的设置?

显示我想实现的附加图像: scrapy

最佳答案

我现在已经做到了,没有规则。我为每个 start_url 附加了一个 meta 属性,然后自己检查链接是否属于原始域并相应地发出新请求。

因此,覆盖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'],将域与提取的链接进行比较并发送新的要求我们自己。

关于python - 用Scrapy爬取多个域不交叉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24316900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com