python – 使用Scrapy爬网多个域,没有纵横交错
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 使用Scrapy爬网多个域,没有纵横交错,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1874字,纯文字阅读大概需要3分钟。
内容图文
我已经设置了一个聚合所有出站链接的CrawlSpider(仅通过例如DEPTH_LIMIT = 2从start_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,但在我看来,这会导致以下问题:
>是否会为每个start_urls / allowed_domain应用设置DEPTH_LIMIT?
>更重要的是:如果站点已连接,蜘蛛会从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)]
在随后的解析方法中,我们获取元属性domain = response.request.meta [‘domain’],将域与提取的链接进行比较,并自己发送新的请求.
内容总结
以上是互联网集市为您收集整理的python – 使用Scrapy爬网多个域,没有纵横交错全部内容,希望文章能够帮你解决python – 使用Scrapy爬网多个域,没有纵横交错所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。