Scrapy:存储所有外部链接并爬取所有内部链接
Scrapy: store all external links and crawl all interal links
我一直在研究一个 scrapy 网络抓取工具,它从一开始 url 开始抓取所有内部 link,并且只收集 scrapy
的外部 link。但是,我的主要问题是对外部 link 和内部 link 进行分类。例如,当我尝试使用 link.startswith("http") or link.startswith("ftp") or link.startswith("www")
过滤掉外部 links 时,如果网站 links 它自己的网站具有绝对路径(www.my-domain.com/about
而不是 /about
) 然后,它会将其归类为外部 link,即使它不是。以下是我的代码:
import scrapy
from lab_relationship.items import Links
class WebSpider(scrapy.Spider):
name = "web"
allowed_domains = ["my-domain.com"]
start_urls = (
'www.my-domain.com',
)
def parse(self, response):
""" finds all external links"""
items = []
for link in set(response.xpath('//a/@href').extract()):
item = Links()
if len(link) > 1:
if link.startswith("/") or link.startswith("."):
# internal link
url = response.urljoin(link)
item['internal'] = url
#yield scrapy.Request(url, self.parse)
elif link.startswith("http") or link.startswith("ftp") or link.startswith("www"):
# external link
item['external'] = link
else:
# misc. links: mailto, id (#)
item['misc'] = link
items.append(item)
return items
有什么建议吗?
if 可以接受多个 or 语句,而不仅仅是两个。
使用 link extractor.
实例化时必须传递允许的域。您不必担心指定所需的标签,因为(根据文档)参数 tags
默认采用 ('a', 'area')
。
在 Rust lang 网站的示例中,从其域中打印所有内部 link 的代码如下所示:
import scrapy
from scrapy.linkextractors import LinkExtractor
class RustSpider(scrapy.Spider):
name = "rust"
allowed_domains = ["www.rust-lang.org"]
start_urls = (
'http://www.rust-lang.org/',
)
def parse(self, response):
extractor = LinkExtractor(allow_domains='rust-lang.org')
links = extractor.extract_links(response)
for link in links:
print link.url
并且输出将是这样的 link 的列表:https://doc.rust-lang.org/nightly/reference.html(我不能 post 更多),同时排除所有 link 之类的那些到 Whosebug。
请务必查看文档页面,因为 link 提取器有许多您可能需要的参数。
我一直在研究一个 scrapy 网络抓取工具,它从一开始 url 开始抓取所有内部 link,并且只收集 scrapy
的外部 link。但是,我的主要问题是对外部 link 和内部 link 进行分类。例如,当我尝试使用 link.startswith("http") or link.startswith("ftp") or link.startswith("www")
过滤掉外部 links 时,如果网站 links 它自己的网站具有绝对路径(www.my-domain.com/about
而不是 /about
) 然后,它会将其归类为外部 link,即使它不是。以下是我的代码:
import scrapy
from lab_relationship.items import Links
class WebSpider(scrapy.Spider):
name = "web"
allowed_domains = ["my-domain.com"]
start_urls = (
'www.my-domain.com',
)
def parse(self, response):
""" finds all external links"""
items = []
for link in set(response.xpath('//a/@href').extract()):
item = Links()
if len(link) > 1:
if link.startswith("/") or link.startswith("."):
# internal link
url = response.urljoin(link)
item['internal'] = url
#yield scrapy.Request(url, self.parse)
elif link.startswith("http") or link.startswith("ftp") or link.startswith("www"):
# external link
item['external'] = link
else:
# misc. links: mailto, id (#)
item['misc'] = link
items.append(item)
return items
有什么建议吗?
if 可以接受多个 or 语句,而不仅仅是两个。
使用 link extractor.
实例化时必须传递允许的域。您不必担心指定所需的标签,因为(根据文档)参数 tags
默认采用 ('a', 'area')
。
在 Rust lang 网站的示例中,从其域中打印所有内部 link 的代码如下所示:
import scrapy
from scrapy.linkextractors import LinkExtractor
class RustSpider(scrapy.Spider):
name = "rust"
allowed_domains = ["www.rust-lang.org"]
start_urls = (
'http://www.rust-lang.org/',
)
def parse(self, response):
extractor = LinkExtractor(allow_domains='rust-lang.org')
links = extractor.extract_links(response)
for link in links:
print link.url
并且输出将是这样的 link 的列表:https://doc.rust-lang.org/nightly/reference.html(我不能 post 更多),同时排除所有 link 之类的那些到 Whosebug。
请务必查看文档页面,因为 link 提取器有许多您可能需要的参数。