我正在使用CrawlSpider
来获取多个Domain
个对象(包含main_url
和name
- 域名)。然后它为每个Domain
对象抓取整个页面。
因此Domain
有main_url = 'http://www.example.com'
和name = 'example.com'
。我需要为此域的每个响应获取此domain
对象。所以http://www.example.com
,http://www.example.com/x
,http://www.example.com/x/x/y/
等
因此,每当我解析来自此域的响应时,我都会得到特定的Domain
对象。
问题在于rules = ()
class MainSpider(CrawlSpider):
name = 'main_spider'
rules = (
Rule(LinkExtractor(), callback='parse_item', follow=True,),
)
def start_requests(self):
for d in Domain.objects.all():
self.allowed_domains.append(d.name)
yield scrapy.Request(d.main_url,callback=self.parse,meta={'domain':d})
def parse_item(self, response):
# I need to get `Domain` object for all responses
你知道怎么做吗?而且,这还有另一个问题。它没有向parse_item
方法发送第一个(根)网址响应。
答案 0 :(得分:2)
我不知道你的最终目标是什么,但认为你可以这样做,创建dict all_responses
并在每个网址被抓取后,将其作为关键字放入字典url
您可以使用self.all_responses["MY_LINK_HERE"]
根据链接访问任何域对象。
class MainSpider(CrawlSpider):
name = 'main_spider'
rules = (
Rule(LinkExtractor(), callback='parse_item', follow=True,),
)
all_responses = {}
def start_requests(self):
for d in Domain.objects.all():
self.allowed_domains.append(d.name)
yield scrapy.Request(d.main_url,callback=self.parse,meta={'domain':d})
def parse_item(self, response):
self.all_responses[response.url] = response.meta['domain']
我认为不要使用Rule
类,而是使用LinkExtractor
,这样您就可以随意发送meta
变量。
或者这样做,
from scrapy.linkextractors import LinkExtractor
extractor = LinkExtractor(allow_domains="www.website.com")
links = extractor.extract_links(response)
for link in links:
yield scrapy.Request(link.url, callback=self.my_callback)
答案 1 :(得分:1)
我不确定第一个问题,但要解决第二个问题,您可以覆盖INSTALLED_APPS = [
...
'pinax',
'pinax.notifications',
...
]
类的方法parse_start_url
。